2017-01-21 10 views
1

Мои искренние извинения, если этот вопрос уже задан, но другие ответы, которые я видел, сбивали с толку. У меня есть класс, который я хочу использовать для построения 2D-матрицы другого типа объекта. Я пытаюсь написать метод для создания новых объектов и назначить указатели в 2D-векторе для новых объектов, но я не могу получить синтаксис правильно.(C++) Синтаксис для создания экземпляров и назначения новых объектов в 2D-вектор указателей на один и тот же тип объекта?

создать 2D-вектор, как это:

std::vector<std::vector<CSinusoid*>> *m_SineMatrix; //2D Vector of pointers to CSinusoid objects 

И тогда я пытаюсь создать метод вдоль этих линий:

void CWaveMatrix::Init_SineMatrix(int x, int y) 
{ 
    m_SineMatrix[x][y] = new CSinusoid(); 
} 

Строка кода внутри функции, где я возникли проблемы. Я не знаю, как указать конкретный указатель в 2D-векторе, чтобы указать на новый объект.

Обратите внимание, что и вектор, и метод являются частными членами одного и того же класса.

ответ

1

Строка кода внутри функции - это то место, где у меня возникают проблемы. Я не знаю, как указать конкретный указатель в 2D-векторе, чтобы указать на новый объект.

Ваш код уже делает это. Оператор new создает новый объект и сразу же указывает на него вектор.

Как боковая точка, есть ли причина, по которой у вас есть вектор указателей? Векторы уже выделяются в куче, поэтому вы можете просто захотеть поместить простые объекты в вектор и получить к ним доступ таким образом. Менее вероятно приведет к неприятностям в будущем.

+0

К сожалению, мне кажется, я пропустил некоторые ключевые данные. Внутри Visual Studio знак '=' внутри строки кода под вопросом подчеркивается красным.Когда я нависаю над красной линией, сообщение читает: «no operator» = «соответствует этим операндам». Обычно все, что подчеркивается красным, означает, что что-то не так - вы уверены, что в моем синтаксисе нет ничего плохого? У меня есть вектор указателей, потому что я не знал, что вы только что сказали мне. Хороший звонок! – fmwavesrgr8

+0

Ах, я не заметил, что сама m_SineMatrix является указателем! Вы должны попробовать '(* m_SineMatrix) [i] [j] = новый CSinusoid()'. – PrestonH

2

Я думаю, ваша проблема на самом деле здесь:

std::vector<std::vector<CSinusoid*>> *m_SineMatrix 

m_SineMatrix не 2D вектор CSinusoid указателей ... это указатель на такой вектор. Оператор C++ [] работает как с исходными указателями так и с векторами. Таким образом, код в вашей функции вызовет оператор [x] на указателе и обработает результат как 2D-вектор, затем вызовет оператор [y] на двумерном векторе и обработает результат как 1D-вектор. Он не знает, как назначить CSinusoid * вектору CSinusoid * s, поэтому он жалуется.

Чтобы исправить это, вы можете либо изменить * m_SineMatrix на m_SineMatrix, либо изменить выполняемую функцию (* m_SineMatrix) [x] [y].

0

EDITED

Хорошо - получается реальная проблема, которую я имел с этим, что я неправомерно vizualized 2D-вектор в буквальном смысле является сетка типа объекта, когда на самом деле это вектор переносчиков объектов. В этом случае синтаксис «vectorName [0] [0] =» напрямую обращается к объектам, wereas «vectorName [0] =» обращается к вектору объектов, поэтому по существу мой код пытался сказать «thisType = thatType», а не говоря «thisType = thisType». Это было бы похоже на попытку сказать, что bool равен float или что-то в этом роде. Это объясняет красный подчеркнутый знак «=».

Ниже был рабочий раствор:

std::vector<CSinusoid> vTemp; //Create a vector of object<type> 
CSinusoid Sine; //Create an object of same type 

for (int i = 0; i < x; i++) 
{ 
    vTemp.push_back(Sine); //Add copies of the object to new vector //A vector of vectors of objects 
std::vector<std::vector<CSinusoid>> m_SineMatrix; 
} 

for (int i = 0; i < y; i++) 
{ 
    m_SineMatrix.push_back(vTemp); //Add copies of that vector to 2D member vector of objects 
}