c++ 为 class 调用构造函数
c++ Calling a constructor for a class
我不熟悉 C++ 的更大概念,正在尝试编写一个小程序来测试构造函数和解构函数的行为。但是,由于对 myClass::myClass 的未定义引用或无法直接调用构造函数的愚蠢错误,我似乎无法编译程序。
我的代码是这样的:
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;
}
我明显做错了什么吗?来自这里的 Java 背景。
====编辑====
找出问题所在。现在我觉得很傻。
无论出于何种原因,myClass.h 和 myClass.cpp 文件已创建并位于我的项目目录中,但未显示在 code::blocks 的项目树中。一旦我将文件添加到项目中,它就成功编译了。
感谢您的宝贵时间和答复。尽管我的问题与我的代码并没有真正的关系,但我仍然从您的回复中学到了一些东西。
在"myClass.cpp"中,您需要在定义函数时完全限定函数的名称。即
myClass::myClass(int n_x): x(n_x) {
//...
}
编译器不知道您在定义 myClass
的成员函数时没有完全限定。就它而言,您可以定义一些名为 myClass
.
的自由函数
此外,您需要包含 <iostream>
才能使用 std::cout
。
除了您已经得到的关于以正确的名称 space 实施事物的答案之外,并且由于您似乎首先想了解更多关于 constructor/destructor 的信息:
当你看到
myClass* whatever = new myClass();
之所以有效,是因为 new 运算符是返回指针的运算符,该指针可以转换为 myClass 类型的指针。
我什么都不知道 Java,但是在我的印象中,我印象中可能有一些类似显式构造函数的东西 Java 程序员可能已经习惯了。在 C++ 中,构造函数更隐式处理,例如子类上的构造函数链不需要(甚至不支持)显式调用,它们会自动调用继承链。
长话短说,不要像普通函数一样对待构造函数和析构函数,就像要实现的方法一样,而是像强制性的、隐式管理的资源处理程序一样对待它们。
我不熟悉 C++ 的更大概念,正在尝试编写一个小程序来测试构造函数和解构函数的行为。但是,由于对 myClass::myClass 的未定义引用或无法直接调用构造函数的愚蠢错误,我似乎无法编译程序。
我的代码是这样的:
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;
}
我明显做错了什么吗?来自这里的 Java 背景。
====编辑==== 找出问题所在。现在我觉得很傻。 无论出于何种原因,myClass.h 和 myClass.cpp 文件已创建并位于我的项目目录中,但未显示在 code::blocks 的项目树中。一旦我将文件添加到项目中,它就成功编译了。
感谢您的宝贵时间和答复。尽管我的问题与我的代码并没有真正的关系,但我仍然从您的回复中学到了一些东西。
在"myClass.cpp"中,您需要在定义函数时完全限定函数的名称。即
myClass::myClass(int n_x): x(n_x) {
//...
}
编译器不知道您在定义 myClass
的成员函数时没有完全限定。就它而言,您可以定义一些名为 myClass
.
此外,您需要包含 <iostream>
才能使用 std::cout
。
除了您已经得到的关于以正确的名称 space 实施事物的答案之外,并且由于您似乎首先想了解更多关于 constructor/destructor 的信息:
当你看到
myClass* whatever = new myClass();
之所以有效,是因为 new 运算符是返回指针的运算符,该指针可以转换为 myClass 类型的指针。
我什么都不知道 Java,但是在我的印象中,我印象中可能有一些类似显式构造函数的东西 Java 程序员可能已经习惯了。在 C++ 中,构造函数更隐式处理,例如子类上的构造函数链不需要(甚至不支持)显式调用,它们会自动调用继承链。
长话短说,不要像普通函数一样对待构造函数和析构函数,就像要实现的方法一样,而是像强制性的、隐式管理的资源处理程序一样对待它们。