2015-07-14 4 views
0

Я новичок в более крупных концепциях C++ и пытаюсь написать небольшую программу для проверки поведения конструкторов и деконструкторов. Однако я не могу заставить программу скомпилироваться из-за глупых ошибок в отношении неопределенных ссылок на myClass :: myClass или неспособности напрямую вызвать конструктор.C++ Вызов конструктора для класса

Мой код как таковой:

myClass.h:

#pragma once 

class myClass{ 

int x; 

public: 
    myClass(int n_x); 

    myClass(); 

    ~myClass(); 
}; 

myClass.cpp:

#include <string> 
#include "myClass.h" 

myClass(int n_x) 
:x(n_x) 
{ 
// constructor 
std::cout << "A myClass object was created! And x == " << x << "!" << std::endl; 
} 

myClass() 
:x(10) 
{ 
// default constructor 
std::cout << "A myClass object was created! And x == " << x << "!" << std::endl; 
} 

~myClass() 
{ 
// deconstructor 
std::cout << "A myClass object was destroyed!" << std::endl; 
} 

main.cpp:

#include <iostream> 
#include "myClass.h" 

using namespace std; 

void func(); 
myClass* func2(); 

int main() 
{ 
cout << "Hello world!" << endl; 

myClass obj1; 

func(); 

myClass* obj2 = func2(); 

delete obj2; 

cout << "Goodbye world!" << endl; 

return 0; 
} 

void func() 
{ 
myClass obj1 = myClass(15); 
} 

myClass* func2() 
{ 
myClass* obj1 = new myClass(5); // using the new operator to allocate memory in free space (the heap) 

return obj1; 
} 

Am I, очевидно, что-то не так? Исходя из фона Java здесь.

==== EDIT ==== Обнаружено, что не так. Теперь я чувствую себя глупым. По какой-то причине были созданы файлы myClass.h и myClass.cpp и в каталоге моего проекта, но не показаны в дереве проекта в блоке code ::. Как только я добавил файлы в проект, он скомпилирован успешно.

Благодарим вас за ваше время и ответы. Хотя моя проблема не была действительно связана с моим кодом, я все еще узнал некоторые вещи из ваших ответов.

+1

Эти «глупые ошибки» рассказывают вам, в чем проблема. Включение их облегчит людям помощь! – John3136

+0

Я не помню, чтобы встречаться с ошибкой «Не могу вызвать конструктор напрямую».Не то, чтобы это невозможно: компиляторы иногда выпускают бессмысленную диагностику. Предоставьте полное сообщение об ошибке. –

+0

Да, я попробовал изменить свой код на «myClass obj1 = myClass();» чтобы получить сообщение об ошибке «Невозможно вызвать конструктор», и он не смог заставить его подойти. Теперь я только получаю «неопределенную ссылку на„MyClass :: MyClass()“и аналогичные erros для перегруженного конструктора и деструктора, где когда-либо объекты создаются или из области видимости. Я изменил мой файл myClass.cpp правильно использовать оператор разрешения области видимости для методов (так MyClass :: MyClass() вместо просто MyClass()), но я все еще получаю неопределенную ссылку ошибки. –

ответ

0

Помимо ответа вы уже получили о реализации вещей в их правильном пространстве имен, и так как вы, кажется, хотите узнать больше о конструкторе/деструкторе в первую очередь:

Когда вы видите

myClass* whatever = new myClass(); 

работа потому, что новый оператор - это тот, который возвращает указатель назад, который может быть перенесен на указатель типа myClass.

Я не знаю ни одной Java, но просмотрев код на C++ людьми, у которых есть под впечатлением, может быть что-то вроде явных конструкторов, к которым могут быть применены Java-программисты. В C++ конструкторы более неявно обрабатываются, E.G. цепочки конструкторов при подклассификации не нуждаются (даже не поддерживают) явный вызов, они автоматически вызываются цепочкой наследования.

Короче говоря, не рассматривайте конструкторы и деструкторы как обычные функции, такие как методы для реализации, рассматривайте их как обязательные, неявно управляемые обработчики ресурсов.

+0

re «Ваш конструктор не возвращает объект типа myClass, компилятор не сможет его разрешить». Не уверен, что вы пытаетесь сказать здесь, например, что это такое, но это звучит как недоразумение. –

+0

Правда, отредактировал это. Имея проблемы с формулированием того, что я хочу получить. –

+1

О, но «его нельзя назвать похожим на какую-то именованную функцию, которая, как ожидается, вернет построенный экземпляр вашего класса», он может быть вызван таким образом. Вот почему мне было бы интересно увидеть предполагаемую диагностику ошибок OP. –

1

В «myClass.cpp» вам необходимо полностью определить имена функций при их определении. То есть

myClass::myClass(int n_x): x(n_x) { 
//... 
} 

компилятор не знает, что вы определяете функции-члены myClass без полной квалификации. Насколько это важно, вы можете определить некоторую свободную функцию с именем myClass.

Кроме того, для использования std::cout также необходимо указать <iostream>.

Смежные вопросы