2016-02-23 2 views
1
  • Я новичок в C++. Компилятор жалуется на строку ниже: inv.inventory [0] = «Книги». Помогите мне, как я могу присвоить значения статическому массиву в классе.

// Класс декларацииC++ присваивает значения статическому массиву в классе

#include <iostream> 
#include <iomanip> 
#include <string> 
using namespace std; 

class Items 
{ 
private: 
    string description; 
public: 
    Items() 
    { 
     description = ""; } 

    Items(string desc) 
    { 
     description = desc;} 

    string getDescription() { return description; } 

}; 
class InventoryItems { 
public: 
    static Items inventory[5]; 

}; 
// main function 
int main() 
{ 
    const int NUM = 3; 
    InventoryItems inv; 
    inv.inventory[0] = "Books"; 

    for (int i = 0; i < NUM; i++) 
    { 
     cout << inv.inventory[i].getDescription() << endl; 
    } 


    return 0; 
} 

Я получаю ниже ошибки:

invMain.cpp:31: error: no match for operator= in InventoryItems::inventory[0] = "Books" invMain.cpp:7: note: candidates are: Items& Items::operator=(const Items&)

ответ

1

Вы не сказали, что ошибка. Я скомпилировал тот же код в Visual Studio 2015 и получил «binary '=': no ​​operator found».

Таким образом, проблема в том, что вы не определили operator = для класса Items. Вам это нужно, потому что элементы не эквивалентны строке, хотя в данный момент она содержит только строку.

1

Есть несколько вещей, здесь не так:

static Items inventory[5]; 

static говорит, что есть один и только один inventory для всех InventoryItems. К сожалению, он не выделяет место для него со всеми компиляторами. OP можно увидеть

undefined reference to `InventoryItems::inventory'

Вы можете выделить для хранения с

class InventoryItems { 
public: 
    static Items inventory[5]; 

}; 

Items InventoryItems::inventory[5]; // needs to be defined outside the class 

Другая большая проблема вы пытаетесь засунуть квадратный колышек в круглое отверстие и получить что-то вдоль линий

error: no match for 'operator='

"Books" - const char *, а не товары. const char * легко преобразуется в string, потому что кто-то нашел время, чтобы написать функции, которые выполняют эту работу. Вам также придется.

Вы можете превратить его в Items, а затем присвоить ему

inv.inventory[0] = Items("Books"); 

Это создает временный Items, а затем после копирования уничтожает его. Бит дорого, потому что у вас есть конструктор и деструктор, вызываемый только для копирования одной строки dang.

Вы также можете позвонить сделать это следующим образом:

InventoryItems::inventory[0] = Items("Books"); 

, потому что все InventoryItems одни и те же inventory, вы не должны создать InventoryItems, чтобы получить inventory.

Если вы не хотите, чтобы создавать и уничтожать лишние объекты, вы можете написать оператор присваивания для элементов, которые принимает строку

Items & operator=(string desc) 
{ 
    description = desc; 
    return *this; 
} 

Теперь оба

InventoryItems::inventory[0] = Items("Books"); 

и

InventoryItems::inventory[1] = "Pizza"; 

работа.

Вы также можете создать функцию сеттер в Items

void setDesc(string desc) 
{ 
    description = desc; 
} 

Теперь вы можете в течение примерно той же стоимости, что и operator=

InventoryItems::inventory[2].setDesc("Beer"); 

Что вы выбрали его для вас. В этом случае мне лично нравится сеттер. Более очевидно, что вы делаете, чем = и менее дорогостоящи, чем временная переменная.

+0

спасибо. Оно работает. Отлично. – hamid

Смежные вопросы