我写了一些小课,现在我看到了调用构造函数的不同方法。哪种方式正确? (或者更好的方式)
SharedKeys.h
#ifndef SHAREDKEYS_H
#define SHAREDKEYS_H
class SharedKeys
{
private:
char keyCode;
public:
SharedKeys(char keycode)
{
keyCode = keycode;
}
~SharedKeys() {}
char getKeyCode() { return keyCode; };
};
#endif
Main.cpp的
我的构造函数调用方式:
SharedKeys* SK;
SK = new SharedKeys(*cstr); //Call contructor
其他构造函数调用方式:
// SharedKeys constructor
SharedKeys::SharedKeys(*cstr)
{
keyCode = keycode;
}
我愿意接受任何改进建议。谢谢。
Main.cpp的
SK必须是这里的指针还是? (此代码有效)
SharedKeys* SK;
vector<SharedKeys> StoreSharedKeys;
string str = x;
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
SK = new SharedKeys(*cstr);
StoreSharedKeys.push_back(*SK);
delete[] cstr;
我理解正确吗?
cout << "Key: " << x << " loaded." << endl;
string str = x;
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
SharedKeys SK(*cstr);
StoreSharedKeys.push_back(SK);
delete[] cstr;
如果我看到正确的话,那么这个构造函数调用是正确的方法。所以我不必删除对象。正确的吗?
答案 0 :(得分:1)
第二个“通话”根本不是通话。
这是一种课外定义。类的方法(包括构造函数和析构函数)可以在类的主体内部或外部定义。如果方法是在类之外定义的,那么只能在类中声明它们。
使用类外定义的一个重要原因是,您可以将类定义放在头文件中,将方法定义放在.cpp文件中。
答案 1 :(得分:1)
创建对象有两种方法:
SharedKeys sk( 'a');
SharedKeys* sk_ptr = new SharedKeys( 'a');
第一行在堆栈上创建一个对象,当它超出范围时将被删除(例如,函数结束)。
第二行动态创建一个对象,一旦保留范围,该对象将不会被删除。您必须使用delete
手动删除它。或者,更好的是,使用智能指针。
您选择创建对象的方式取决于用例,对象的大小(应始终动态分配大对象),对象的生命周期等。但两种方法最终都会调用相同的构造函数。 / p>
答案 2 :(得分:0)
问题可能在于形式 你可以编写没有动态分配内存的构造函数
SharedKeys SK(*cstr);
或与:
SK = new SharedKeys(*cstr);
我看到的第二件事......你看到了例子
#include <iostream>
void function(char a, int lenght)
{
std::cout << a << std::endl;
// for (int i = 0; i < lenght; i++) printf("%c ", a[i]);
}
void function2(char *a, int lenght)
{
for (int i = 0; i < lenght; i++) printf("%c ", a[i]);
}
int main()
{
char tab[2]{ 'a','b' };
// function(tab,2);
function(*tab,2);
// function2(tab,2);
// function2(*tab,2);
return 0;
}
你的行
SK = new SharedKeys(*cstr);
这一行只给出构造函数的第一个元素数组,我认为它不像你想要的那样。如果你想要给出数组char,你应该使用来自function2
的formule(来自示例)。
编辑: 是的,你必须删除对象,
delete[] cstr
和
delete SK