2015-11-25 196 views
0

我試圖將位於_name中的字符數組傳遞給名爲char的引用。通過引用字符數組傳遞

但是,將數組指針傳遞給引用時,它只會顯示第一個字符而不是整個字符串。

我的問題是你將如何創建一個字符引用數組來將原始指針複製到它然後顯示它?如item.cpp中所示,我們將_name指針複製到名稱的引用中,然後返回名稱,但它只顯示字符串的第一個字符。

我只會顯示我的代碼的相關部分。

Item.cpp:

void Item::name(const char * name){ 

     strncpy(_name, name , 20); 
} 
const char& Item::name() const{ 
     char& name = *_name; 
     return name; 
} 

ItemTester.cpp:

的Main():

int main(){ 
    double res, val = 0.0; 
    fstream F; 
    SItem Empty; 
    SItem A("456", "AItem", 200); 
    SItem B("567", "BItem", 300, false); 
    //cout << A.name() << endl; 
    B.quantity(50); 
    //cout << Empty << endl; 
    cout << A << endl << B << endl << endl; 
    cout << "Enter Item info for A: (Enter 123 for sku)" << endl; 
    cin >> A; 

    cout << "Copying A in C ----" << endl; 
    SItem C = A; 
    cout << C << endl << endl; 
    cout << "Saving A---------" << endl; 
    A.save(F); 
    cout << "Loading B----------" << endl; 
    B.load(F); 
    cout << "A: ----------" << endl; 
    cout << A << endl << endl; 
    cout << "B: ----------" << endl; 
    cout << B << endl << endl; 
    cout << "C=B; op=----------" << endl; 
    C = B; 
    cout << C << endl << endl;; 
    cout << "Operator ==----------" << endl; 
    cout << "op== is " << ((A == "123") && !(A == "234") ? "OK" : "NOT OK") << endl << endl; 
    cout << "op+=: A += 20----------" << endl; 
    A += 20; 
    cout << A << endl << endl; 
    cout << "op-=: A -= 10----------" << endl; 
    A -= 10; 
    cout << A << endl << endl; 
    cout << "op+=double: ----------" << endl; 
    res = val += A; 
    cout << res << "=" << val << endl << endl; 
    return 0; 
} 

ostream的寫

virtual std::ostream& write(std::ostream& os, bool linear)const{ 

    return os << sku() << ": " << name() << endl 
     << "Qty: " << quantity() << endl 
     << "Cost (price * tax): " << fixed << setprecision(2) << cost(); 
    } 

讓我知道如果我錯過了任何重要的細節和il編輯我的文章。

回答

1

char&是對char的引用,因此只是單個字符。參考字符數組將是char*&

例子:

class Test 
{ 
private: 
    static const size_t maxlen = 100; 
    char* _name; 
public: 
    Test() : _name(new char[maxlen+1]) {} 
    ~Test() {delete _name;} 
    void name(const char* s) 
    { 
     if(strlen(s) >= maxlen) 
      throw "too long"; 
     else 
     { 
      memcpy(_name, s, strlen(s) * sizeof(char)); 
      _name[strlen(s)] = '\0'; 
     } 
    } 
    char*& name() 
    { 
     return _name; 
    } 
}; 

int main() 
{ 
    Test obj; 
    obj.name("testname"); 
    cout<<"Name = "<<obj.name()<<endl; 
    obj.name()[0] = '*'; 
    cout<<"After change: Name = "<<obj.name()<<endl; 
    return 0; 
} 

編輯:

我會改變 「吸」 到這樣的:如果你想的方法是 「常量」

char*& Item::name() { 
     return _name; 
} 

其實,在這個類的用戶不應該改變數組的元素,或者數組的實際地址,那麼你不需要返回一個char * &,你可以簡單地返回const char *

const char* Item::name() const { 
     return _name; 
} 

據我所見,char*&型的目的是,客戶端將能夠更改地址的實際地址。

+0

更改getter函數爲char *&給我,ü不能返回_name錯誤。 – petermytt

+0

@petermytt這可能是由於您將此函數設爲const函數的事實。請閱讀我最近編輯的答案。另外:不要忘記更改頭文件(.h)。 – CForPhone

0

正如CForPhone所指出的,char&不是你真正想要的,你的意思可能是char*。但即便如此,使用char*表示字符串是C.在C++中,你應該使用std::string

const string Item::name() const{ 
     string name(_name); 
     return name; 
} 
+0

沒有合適的從「std :: string」到「const char」的轉換函數存在 – petermytt

+0

應該是const String {Item :: name()const {',而不是'const char&Item :: name()const {'。 –