2011-09-30 20 views
9

के साथ वर्चुअल विधि को ओवरराइड करते समय चेतावनी कैसे दी जाए, वर्चुअल विधि को ओवरराइड करते समय, मैंने देखा कि जब मैं दृश्यता (सार्वजनिक विधि के रूप में ओवरराइड की गई सुरक्षित विधि) में गलती करता हूं, तो मुझे संकलक द्वारा चेतावनी नहीं दी जाती है ।गलत दृश्यता

यह वैध सी ++ है, लेकिन आमतौर पर यह एक गलती है।

उदाहरण के लिए:

#include <iostream> 

class Base 
{ 
protected: 
    virtual void ProtectedMethod(void) 
    { 
    std::cout << "Base::ProtectedMethod" << std::endl; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    virtual void ProtectedMethod(void) 
    { 
    std::cout << "Derived::ProtectedMethod" << std::endl; 
    } 
}; 

int main(int, char* []) 
{ 
    Derived d; 
    d.ProtectedMethod(); 
} 

मैं जीसीसी और बजना साथ संकलन की कोशिश की, -Wall -Wextra साथ, कोई भाग्य के साथ। मैं इस कोड पर सीपीपी चेक चला गया, अभी भी कोई भाग्य नहीं है।

कौन सा टूल मुझे इसका पता लगाने में मदद कर सकता है? मुझे उस लाइब्रेरी के पूरे स्रोत को ठीक करने की आवश्यकता है जिस पर मैं काम कर रहा हूं।

+0

ठीक नहीं:

यहाँ ctags उत्पादन से जानकारी निकालने के लिए एक पार्टी का टुकड़ा है। जैसा कि सवाल में बताया गया है, मैं स्वीकार करता हूं कि यह पूरी तरह वैध सी ++ है। आम तौर पर, यह वही नहीं है जो मैं चाहता हूं, क्योंकि मैं कुछ ऐसा उजागर कर रहा हूं जिसे प्रकट नहीं किया जाना चाहिए। – Julien

+0

हाँ, यह कोई गलती नहीं है। यह केवल कुछ भाषा है जो आपको लिखने की अनुमति देती है, भले ही यह लेखक का इरादा न हो। यह उन अनुमानों में से एक होगा "मुझे बताओ अगर मेरा मतलब कुछ और है" चेतावनियां, मुझे लगता है। कौन जानता है, हो सकता है कि ऐसी परिस्थितियां हों जहां आप किसी ऐसे व्यक्ति के लिए एक फ़ंक्शन पहुंच योग्य चाहते हैं जो व्युत्पन्न प्रकार को जानता हो, लेकिन किसी भी व्यक्ति को न केवल बेस प्रकार को जानता हो। –

+0

यह एक उत्कृष्ट सवाल है। –

उत्तर

0

मैं मेरी जरूरतों ctags का उपयोग कर के लिए एक समाधान मिल गया।

सीटीएजी सी ++ को पार्स कर सकते हैं और फ़ाइल को डंप जानकारी दे सकते हैं।

निम्नलिखित विकल्पों का उपयोग करना:

$CTAGS -f $TAGFILE --fields=fkstia --c++-kinds=+p -R $SOURCES 

मैं एक आसानी से parseable प्रारूप में सभी आवश्यक जानकारी प्राप्त कर सकते हैं।

कुछ grep आदेशों के माध्यम से $TAGFILE पिपिंग, मैं सत्यापित कर सकता हूं कि एक ज्ञात फ़ंक्शन नाम की अपेक्षित दृश्यता है, और अन्यथा संचित फ़ाइल के साथ चेतावनी जारी करें। एक गलती

#!/bin/bash 
function check_method { 
    echo "Checking $1 (should be $2 and is not)" 
    cat $TAGFILE | grep "^$1 " | grep "access" | grep -v "access:$2" | cut -f 2 
    echo 
} 

# will warn anytime a method called ProtectedMethod is not protected 
check_method ProtectedMethod protected 
संबंधित मुद्दे