2016-12-19 9 views
1

Я думаю, что проблема связана с этим конструктором:Как повторно вызов конструктора из inititialized 3D вектора

vector<vector<vector<int>>> itemMatrix; 
ItemConstruct(int numOfZ, int numOfY, int numOfX) 
:itemMatrix(numOfZ, vector<vector<int>>(numOfY, vector<int>(numOfX, 1))){} 

и когда я пытаюсь позвонить в:

int main (int nNumberofArgs, char* pszArgs[]) 
{ 
    int a1; int b1; int c1; 
    int a2; int b2; int c2; 
    Space i1; 
    Item i2; 
    ItemConstruct i3; 
    cin>>a1>>b1>>c1>>a2>>b2>>c2; 
    i1.setSize(a1, b1, c1); 
    i2.setSize(a2, b2, c2); 
    cout<<"answer: "<<i3.getA(); 
    cin.ignore(10, '\n'); 
    cin.get(); 
    return 0; 

} 

я получил ошибку как:

Нет соответствия конструктор для инициализации 'ItemConstruct'

class ItemConstruct 
{ 
private: 
    int numOfX; 
    int numOfY; 
    int numOfZ; 
    int A; 
public: 
    void reqOfItem (Space spc, Item item) 
    { 
     numOfX = item.getX()/spc.getX(); 
     numOfY = item.getY()/spc.getY(); 
     numOfZ = item.getZ()/spc.getZ(); 
    } 
    int getNumOfZ() {return numOfZ;} int getNumOfY() {return numOfY;} int getNumOfX() {return numOfX;} 
    vector<vector<vector<int>>> itemMatrix; 
    ItemConstruct(int numOfZ, int numOfY, int numOfX) 
    :itemMatrix(numOfZ, vector<vector<int>>(numOfY, vector<int>(numOfX, 1))){} 
    void Matrix (int Z, int Y, int X) 
    { 
     for(int z=1; z<=Z; z++) 
     { 
      for(int y=1; y<=Y; y++) 
      { 
       for(int x=1; x<=X; x++) 
       { 
        itemMatrix[z][y][x]=15; 
       } 
      } 
     } 
     A=itemMatrix[2][2][2]; 
    } 
    int getA() 
    { 
     return A; 
    } 

}; 

Дополнение Я не уверен, как изменить элемент 3D-вектора. Я попытался изменить цикл «за», как вы видите выше. Вы можете игнорировать значение «A». Я просто хочу убедиться, как работает этот метод. Я очень новичок в языке C++. Пожалуйста, помогите мне правильно исправить свой сценарий.

Спасибо.

+2

вы пытаетесь вызвать конструктор по умолчанию (вызываемый без аргументов), но ваш 'ItemConstruct' не имеет. Либо укажите конструктор по умолчанию, либо укажите параметры, необходимые для построения. – user463035818

+0

Не строите объект до тех пор, пока не получите значения для его построения. В отличие от C, вам не нужно объявлять все заранее. Стандартная практика заключается в том, чтобы объявлять вещи как можно ближе к точке использования, поэтому легче понять код. – NathanOliver

ответ

0

Здесь:

ItemConstruct i3; 

вы вызываете конструктор по умолчанию (а СУУ отозваны без параметров), но ваш класс не имеет. Вы можете превратить ваш конструктор в конструктор по умолчанию, обеспечивая значения по умолчанию для параметров:

ItemConstruct(int numOfZ = 0, int numOfY = 0, int numOfX = 0) 

Однако, лучший подход, чтобы убедиться, у вас есть все, что нужно, чтобы построить объект перед вызовом конструктора (после построения объект, он должен находиться в допустимом состоянии, и это не всегда возможно с конструктором по умолчанию параметры могут быть необходимы, чтобы положить объект в результативном состоянии):.

int a,b,c; 
cin>>a>>b>>c; 
ItemConstruct i3(a,b,c);