我有一个功能" testfunc()"在课堂上#34;测试"在名称空间下" TEST_NS"。
在主程序中,我创建了一个指向"测试"并且想指向" testfunc()"功能。没问题......
我声明了一个私人变量" foo"作为" Test"的成员," testfunc()"函数尝试更改变量。这导致分段错误。
为什么会这样?
我已经创建了一个简单的例子来展示我的问题。当我在test.cpp
中设置foo = 1;
时发生了段错误
以下是文件:
main.cpp中:
#include <iostream>
#include "test.h"
using namespace std;
int main () {
TEST_NS::Test * test;
test->testfunc();
return 0;
}
test.h:
#include <iostream>
namespace TEST_NS
{
class Test
{
int foo;
public:
Test();
~Test();
void testfunc();
};
}
TEST.CPP:
#include <iostream>
#include "test.h"
using namespace TEST_NS;
Test::Test() { }
Test::~Test() { }
void Test::testfunc()
{
std::cout << "This is testfunc()!" << std::endl;
foo = 1;
}
代码是用
编译的g++ main.cpp test.cpp -o test
用
运行./test
答案 0 :(得分:3)
您的main()
功能需要更改; 首选编写它的方式是
int main () {
TEST_NS::Test test;
test.testfunc();
return 0;
}
如果你真的想使用指针(为什么?),那么你应该写:
int main () {
auto test = new TEST_NS::Test();
test->testfunc();
delete test;
return 0;
}
注意添加delete test;
。但这是不好的做法,因为它会产生内存泄漏的可能性,尤其是在添加更多代码时(或者如果testfunc()
抛出异常)。如果你真的需要使用指针,那么使用std::unique_ptr<>
会更好 。
int main () {
auto test = std::make_unique<TEST_NS::Test>();
test->testfunc();
return 0;
}
请注意,这也消除了明确的new
,这通常是一个好主意,以及必须添加的delete
;另外,它是例外安全的。
现代C ++中“裸”new
或delete
的理由很少。请注意,您仍然可以使用get()
获取“原始”指针,但首选dereferencing
void testfunc(TEST_NS::Test& test)
{
test.testfunc();
}
// ...
testfunc(*test);
答案 1 :(得分:2)
您需要实例化您的类的对象;尝试
TEST_NS::Test * test = new TEST_NS::Test();
test->testfunc();