Passing by reference character arrays

こ雲淡風輕ζ 提交于 2019-12-31 05:26:09

问题


I'm attempting to pass a character array located in _name into a char reference called name.

However, when passing the array pointer into the reference, it would ONLY display the first character rather than the whole string.

My question is how would you create a Character reference array to copy the original pointer into it then displaying it? As show in item.cpp we copy _name pointer into reference of name then return name, it however only displays the first character of the string.

I will only show the relevant pieces of my code.

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 write

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();
    }

Let me know if i missed any important details and il edit my post with it.


回答1:


char& is reference to char, thus just a single character. Reference to array of characters would be char*&.

Example:

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;
}

EDIT:

I would change "getter" to something like:

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

Actually if you do want the method to be "const", in the sense that user of the class should not change the elements of the array, or the actual address of the array, then you need not return a char*&, you can simply return const char*

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

As far as I see, the purpose of a char*& type is that the client would be able to change the actual address of an address.




回答2:


As CForPhone pointed out, char& is not really what you want, you probably meant char*. But even then, using char* to represent strings is for C. In C++, you should use std::string:

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


来源:https://stackoverflow.com/questions/33928075/passing-by-reference-character-arrays

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!