Передача указателя вектора указателей ... нет нет? - PullRequest
2 голосов
/ 04 октября 2010

Впервые в C ++, и это дает мне шипение.

Фактический код находится на другом компьютере, и я не могу его скопировать, поэтому я сделаю все возможное с псевдокодом.

Мой финал - иметь вектор [указателей], к которому могут обращаться несколько различных объектов. Способ, которым я пытался это сделать, заключается в том, чтобы исходный класс, содержащий вектор, имел метод, подобный следующему:

std::vector<myObject*>& myClass::getVectorPointer(){
 return &vectorPointer;
}

Итак, мои различные классы заканчиваются строкой кода, подобной этой:

std::vector<myObject*>* myStuff = myClassObject.getVectorPointer();

Тогда я хочу начать бросать объекты в вектор. Итак, сначала я создаю объект:

MyObject* tempObject = new MyObject("grrr");

А потом я хочу поместить его в вектор, поэтому я сделал это:

myStuff->push_back(tempObject);

Это прекрасно компилируется, но когда я запускаю, он задыхается. Проходя через отладчик я получаю:

402 неверное новое выражение в [some_] allocator :: construct

Понятия не имею, что это значит. Я попытался поставить :: перед моим новым, как в предложенном решении что-то говорилось, но это не сработало.

Итак, чтобы рассмотреть, притвориться, что это было что-то вроде этого, но с правильным синтаксисом и логикой:

Class A.h
#include <vector>
#include "myObject.h"

ClassA{
public:
    classA();

    inline std::vector<myObject*>* myClass::getVectorPointer(){ return &vectorPointer;}


private:
    std::vector<MyObject*>* vectorPointer;
}

#include "A.h"


int main() {

ClassA myClassAObject;  
std::vector<myObject*>* myStuff = myClassAObject.getVectorPointer();  
MyObject* tempObject = new MyObject("grr");  
myStuff->push_back(tempObject);  

}

дает 402.

Это простой синтаксис, или я не в порядке, потому что указатели на векторы указателей просто нет?

Я пытался увидеть, как вы передадите вектор, и хотя большинство вещей, которые я вижу, показывает вызов функции, которая получает & vector и выполняет какие-то действия с вектором в функции, я не понимаю, как сильно отличается от вызова функции, которая возвращает ссылку, а затем делает вещи для вектора там. Это просто огромный логический недостаток с моей стороны?

Любая подсказка, как я могу исправить свою программу на то, что правильно, очень быстро?


Я собираюсь попробовать предложенные вещи. Вы все были невероятно полезны. Большое вам спасибо!

Ответы [ 4 ]

1 голос
/ 04 октября 2010

В приведенном выше коде vectorPointer никогда не назначается / не выделяется.

Обычно лучше возвращать ссылки, а не указатели, поскольку они не могут быть нулевыми.

  Class A.h
#include <vector>
#include "myObject.h"

ClassA{
public:
    classA();

    inline std::vector<myObject*>& myClass::getVectorPointer(){ return vectorPointer;}


private:
    std::vector<MyObject*> vectorPointer;
}
0 голосов
/ 04 октября 2010

Библиотека контейнеров C ++ (или STL, включая vector) может рассматриваться как существующая, чтобы защитить вас от ошибок указателей и тяжелой работы по переопределению структур данных.Поэтому, хотя то, что вы написали, является допустимым C ++ (в любом случае оно скомпилировано), похоже, что вы допустили какую-то ошибку указателя.

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

0 голосов
/ 04 октября 2010

Нет ничего противозаконного в векторах указателей или указателях на векторы указателей.

В вашем коде вы возвращаете адрес указателя на вектор, а не указатель на вектор.

0 голосов
/ 04 октября 2010

Я думаю, вы хотите, чтобы ваш vectorPointer был просто вектором, а не указателем на вектор.когда вы возвращаете указатель, вы фактически возвращаете указатель на указатель.

...