Конструктор класса ссылается на себя, чтобы добавить к вектору

0

Кажется, я не могу заставить конструктор добавить экземпляр класса к вектору. Вот код, который я получил:

main.cpp

#include "object.h"
#include <iostream>
#include <vector>

vector <object> objects;

int _tmain(int argc, _TCHAR* argv[])
{
     object foo(1);
     objects.push_back(foo);
     return 0;
}

object.h

class object {
public:
    int foo;
    object(int);
};

object.cpp

#include "object.h"
object (int foo) {
    object::foo = foo;
}

Я хочу переместить этот objects.push_back (foo) в.cpp файл. Я пытался использовать extern, и это работает, за исключением одного: как мне ссылаться на объект, который строится внутри конструктора?

Заранее спасибо.

  • 0
    Пожалуйста, оставьте актуальный код. Отправленный вами код недействителен и не будет компилироваться.
  • 0
    В частности object foo(); не создает object именем foo . Вместо этого он объявляет функцию с именем foo .
Теги:

4 ответа

1

Прежде всего это

object foo();

это объявление функции, которое не имеет параметров, возвращает объект типа int.

Во-вторых, у вашего объекта класса нет конструктора по умолчанию. Он имеет конструктор с параметром.

object(int);

Поэтому, когда вы создаете объект типа объекта, вы должны указать аргумент.

Учтите, что это определение класса является синтаксическим недействительным

class object {
public:
    int foo;
    object(int)
}

Вы забыли поместить две точки с запятой: одну после объявления конструктора rge и другую после закрывающей скобки определения класса. Должно быть

class object {
public:
    int foo;
    object(int);
};

Также конструктор должен быть определен как

object::object (int foo) {
    object::foo = foo;
}
0

Используйте this указатель для ссылки на объект из своего конструктора.

0

Давайте рассмотрим следующий код, который является частью вашего основного:

class object {};

int main() {
    object foo();
}

Этот код при компиляции под clang сообщает следующее:

foo.cc:4:15: warning: empty parentheses interpreted as a function declaration [-Wvexing-parse]
    object foo();
              ^~
foo.cc:4:15: note: remove parentheses to declare a variable
    object foo();
              ^~
1 warning generated.

Это известно в C++ как самый неприятный анализ.

Вы можете решить это, написав:

int main() {
    object foo;
}
  • 0
    Я думаю, что самый неприятный анализ - это когда у вас есть что-то вроде A foo(B()); в то время как это просто не очень неприятный анализ.
  • 0
    @JosephMansfield: они оба есть, но этот вариант очень легко решить, потому что вы можете просто убрать круглые скобки вместе.
Показать ещё 1 комментарий
0

О, неважно. Нашел вопрос. Удалось использовать ключевое слово "this". Моя проблема заключалась в том, что это указатель и мои объекты, сохраненные в векторе. Поэтому я просто разместил:

objects.push_back(*this);

и это сработало! В любом случае, спасибо, возможно, это будет полезно для кого-то еще в будущем.

  • 0
    Помните, что это сделает копию.
  • 0
    Да, я удалил push_back в основной функции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню