2013-03-08 2 views
2
#include <iostream> 

class Base 
{ 
    public: 
     int id; 
}; 

int main() 
{ 
    Base b(); 
    b.id = 1; 
} 

Что не так с созданием объекта в коде выше? В чем разница между Base b() и Base b?C++ экземпляр класса

+0

Это поможет, если у вас есть конструктор, например Base (int id); – QuentinUK

+0

@ Cheersandhth.-Alf Я уверен, что это дубликат, но это не самый неприятный синтаксический разбор. – juanchopanza

+0

@QuentinUK нет, это не было бы – SomeWittyUsername

ответ

2

Проблема заключается в том, что вы не экземпляра объекта, а объявление функции. Это:

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) 
+0

О, я получаю теперь ... все же я думаю, что очень странно, что я могу объявить функцию в основной функции, но не определять ее там. – kaspersky

2

Этот

Base b(); 

анализируется как объявление функции функции называется b(), которая возвращает объект Base. Вам нужно это:

Base b; 

Это экземпляр Base объекта и вызывать его конструктор по умолчанию. Обратите внимание, что это не будет ноль инициализировать base::id. Вы можете исправить это, предоставляя конструктор по умолчанию, который делает это:

class Base 
{ 
    public: 
     Base() : id(0) {} 
     int id; 
}; 

и инстанцирует таким же образом:

Base b; 
+0

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