我编写了一个小类,现在我看到了调用构造函数的不同方法。哪条路是正确的?(或者更好的方法)
SharedKeys.h
#ifndef SHAREDKEYS_H
#define SHAREDKEYS_H
class SharedKeys
{
private:
char keyCode;
public:
SharedKeys(char keycode)
{
keyCode = keycode;
}
~SharedKeys() {}
char getKeyCode() { return keyCode; };
};
#endifMain.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;如果我认为这是正确的,那么这个构造调用是正确的。所以我不需要删除这些对象。对,是这样?
发布于 2017-07-05 10:27:37
第二个“电话”根本不是一个电话。
这是一个阶级之外的定义。类的方法(包括构造函数和析构函数)可以定义在类的主体内,也可以定义在外部。如果方法是在类之外定义的,则只在类中声明它们。
使用类外定义的一个重要原因是,您可以将类定义放在头文件中,方法定义放在.cpp文件中。
发布于 2017-07-05 10:31:57
创建对象的方法有两种:
SharedKeys sk( 'a');
SharedKeys* sk_ptr = new SharedKeys( 'a');第一行在堆栈上创建一个对象,当它超出作用域(例如函数结束)时,它将被删除。
第二行动态创建对象,一旦保留范围,对象就不会被删除。您必须使用delete手动删除它。或者,更好的是,使用智能指针。
您选择的创建对象的方式取决于用例、对象的大小(应该始终动态地分配大型对象)、对象的生存期等等。但是这两种方法最终都调用了相同的构造函数。
发布于 2017-07-05 10:51:25
问题可能是形式上的,您可以编写构造函数而不需要动态分配内存。
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);这一行只给构造函数提供第一个元素数组,我认为这不是您想要的。如果您想要给数组字符,您应该使用来自function2的格式(例如)。
编辑:是的,您必须删除对象,
delete[] cstr和
delete SKhttps://stackoverflow.com/questions/44923410
复制相似问题