#include <iostream>
class Base
{
public:
int id;
};
int main()
{
Base b();
b.id = 1;
}
Что не так с созданием объекта в коде выше? В чем разница между Base b()
и Base b
?C++ экземпляр класса
#include <iostream>
class Base
{
public:
int id;
};
int main()
{
Base b();
b.id = 1;
}
Что не так с созданием объекта в коде выше? В чем разница между Base b()
и Base b
?C++ экземпляр класса
Проблема заключается в том, что вы не экземпляра объекта, а объявление функции. Это:
Base b(); // Function declaration! (not what you want)
Объявляет функцию b()
, которая возвращает объект типа Base
и не принимает никаких аргументов. Поэтому, когда вы позже попытаться получить доступ к элементу id
, компилятор выдает ошибку, потому что функции не имеют членов:
b.id = 1; // ERROR! b is a function, accessing member "id" makes no sense
Если вы хотите создать экземпляр Base
, вместо этого, просто удалите скобки:
Base b; // Object instantiation! (what you want)
Обратите внимание, что в C++ 11 вы можете изменить значение единообразных инициализацию синтаксис для создания экземпляра класса в значительной степени так, как вы пытались сделать, но фигурные скобки вместо круглых скобок:
Base b{}; // Object instantiation! (what you want, in C++11)
О, я получаю теперь ... все же я думаю, что очень странно, что я могу объявить функцию в основной функции, но не определять ее там. – kaspersky
Этот
Base b();
анализируется как объявление функции функции называется b()
, которая возвращает объект Base
. Вам нужно это:
Base b;
Это экземпляр Base
объекта и вызывать его конструктор по умолчанию. Обратите внимание, что это не будет ноль инициализировать base::id
. Вы можете исправить это, предоставляя конструктор по умолчанию, который делает это:
class Base
{
public:
Base() : id(0) {}
int id;
};
и инстанцирует таким же образом:
Base b;
Я думаю, если вы чувствуете, что лучше дать новый ответ, чем ссылаться на бесчисленные существующие ответы, тогда можно было бы ожидать более полного ответа (т. Е. Чего нет в существующих, которые здесь описаны) –
Это поможет, если у вас есть конструктор, например Base (int id); – QuentinUK
@ Cheersandhth.-Alf Я уверен, что это дубликат, но это не самый неприятный синтаксический разбор. – juanchopanza
@QuentinUK нет, это не было бы – SomeWittyUsername