从文件读取并存储到对象数组"Expression not assignable" C++

read from file and store into object array "Expression not assignable" c++

本文关键字:Expression not assignable C++ 数组 对象 读取 文件 存储      更新时间:2023-10-16

我正试图从一个文件中读取3个值,看起来像这个例子:

ADJ09WAD 303 609.

tempStringtempInt是函数中的局部变量。

void read_inventory(item items[], int size) {
  ifstream inStream;
  inStream.open("inventory.txt");
  int ct = 0;  // counter
  int tempInt;
  string tempString;
  if (!inStream.is_open()) {
    cout << "Error, file did not open" << endl;
    exit(1);
  }
  while (!inStream.eof()) {
    getline(inStream, tempString, ' ');
    items[ct].getid() = tempString;  // accessor to private variables, this one
                                     // is type string and I get no error.
    getline(inStream, tempString, ' ');
    tempInt = atoi(tempString.c_str());  // changing from string to int
    items[ct].getqs() = tempInt;  // I get error "Expression not assignable"
    getline(inStream, tempString, 'n');
    tempInt = atoi(tempString.c_str());
    items[ct].getqr() = tempString;  // same error
    if (ct < size) {
      ct++;
    }
  }
  inStream.close();
};

item类声明为

class item {
 private:
  string id;
  int qs;  // quantity sold
  int qr;  // quantity remaining
 public:
  item();
  string getid() const;
  int getqs() const;
  int getqr() const;
  void Print(item I);
};

items[ct].getqs() = tempInt;//我得到错误"Expression not assignable"

是的,当然,让我们看看你的getter:

int getqs() const;

这意味着,你试图将值赋给一个"int"返回值。这在c++中是行不通的。您可能应该做的是为它添加一个mutator方法,如下所示:

void setqs(int qs);

完成后,您可以按如下方式修复代码:

..
string getid() const;
void setid(const string& id_in) { id = id_in; }
int getqs() const;
void setqs(int qs_in) { qs = qs_in; } 
int getqr() const;
void setqr(int qr_in) { qr = qr_in; }
...
items[ct].setqs(tempInt);

请注意,您需要对其余部分进行类似的操作,因此您的更改总体上看起来像这样:

getline(inStream, tempString, ' ');
items[ct].setid(tempString);
getline(inStream, tempString, ' ');
items[ct].setqs(atoi(tempString.c_str()));
getline(inStream, tempString);
items[ct].setqr(atoi(tempString.c_str()));

请注意,我删除了第三行的显式行尾'n'分隔符,因为这是默认的。

话虽如此,您应该使用std::strtoi函数而不是c++ 11上的atoi。

在以下几行:

items[ct].getqs() = tempInt;
...
items[ct].getqr() = tempString;

左号不是可赋值表达式。函数本身通过复制返回;没有什么要分配的。它们可能会返回对item::qs和item::qr respectively. That said to do that gives direct access to item的私有成员的引用,这就避免了私有成员的目的。最好使用单独的get/set成员函数——这有很多优点——setter函数可以进行范围检查,并为访问数据提供断点位置——当您提供对对象私有成员的引用时,您将失去这种控制。

: items[ct].getid() = tempString;的语义也是可疑的;我怀疑它是否在做你想做的事,即使它在语法上是有效的。如果没有修改对象items[ct],它将修改一个您没有引用的临时对象

相关文章: