2017-06-25 74 views
0
#include <iostream> 
#include <string.h> // strlen, strcpy 

這裏我們有一個非默認ctor的基類,一個名字和它的析構函數的getter。基礎成員的重載下標操作符

class Base { 
    char *name_; 
public: 
    Base(const char* str) 
    : name_{new char[strlen(str)]} 
    { 
    strcpy(name_,str); 
    } 
    char * name() const 
    { 
    return name_; 
    } 
    virtual ~Base() 
    { 
    delete [] name_; 
    } 
}; 

派生類繼承自Base,並有其自己的非默認ctor。

class Derived : public Base { 
public: 
    Derived(const char* str) 
    : Base(str){} 
}; 

我的問題是如何讓主要代碼的最後一行工作?

int main() 
{ 
    char d1name[] {"d1"}; 
    Derived d1(d1name); 
    std::cout << d1.name() << std::endl; 

    d1.name[0] = 'D'; 
} 
+1

您似乎忘記了字符串的真實名稱是*** null終止***字節字符串。 'strlen'不計算空終止符。你爲什麼不簡化自己並使用'std :: string'? –

+0

至於你的問題,你可以通過做例如'd1.name()[0]',或[閱讀更多關於運算符重載](http://en.cppreference.com/w/cpp/language/operators)。也許你應該[找到一個好的初學者書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)應該解釋一切。 –

+0

[運算符重載]可能的重複(https://stackoverflow.com/questions/4421706/operator-overloading) –

回答

0

我的問題是我怎麼做的主代碼的最後一行的工作?

只需加括號來調用吸氣

d1.name()[0] = 'D'; 
     // ^^ 

但總的來說,這是一個不太好主意。您可以在基類public中製作char陣列,或者甚至更好地使用std::string