所以,我来自Java,学习c ++。我想实现一个可以这样调用的程序,由测试文件(靴子)提供:
auto subject = anagram::anagram("diaper");
auto matches = subject.matches({"hello", "world", "zombies","pants"});
vector<string> expected;
BOOST_REQUIRE_EQUAL_COLLECTIONS(expected.begin(), expected.end(), matches.begin(), matches.end());
我是否正确,anagram::anagram(...)
是构造函数,构造一个提供方法matches(...)
的Object?因为在我的实现中(参见下文),我得到一个错误,说“不能直接调用构造函数”(不是英文)。我认为在c ++中有一些我不了解构造函数的东西。
// this is part of my implementation of anagram.h
class anagram{
public:
anagram(const string a);
vector<string> matches(vector<string> &list);
private:
string a;
bool isAnagram(string s);
};
我知道的另一件事是anagram::anagram(...)
可能是一个静态方法,其返回值与this
相似,但这对我来说没有意义。所以如果有人能解释这个会很好:)
答案 0 :(得分:2)
因为你来自java,你习惯于看到类似的东西:
someobject T = new someObject(argument);
在C ++中,您以不同的方式构造一个类:
someObject T(argument);
和tada你在c ++中创建了一个名为T的Object。另一种方法是创建一个指向对象的指针:
someObject *T = new someObject(argument);
更类似于java,但现在你必须手动删除该指针。在堆栈而不是堆上创建对象总是更好。它避免了内存泄漏。
回答你的问题:你弄错了。你像我之前给你看的那样打电话给Constructors。你是如何调用静态成员函数的,但这不适用于Ctor,因为它永远不会是静态的,也不是虚拟的。
答案 1 :(得分:2)
如果调用anagram::anagram
必须工作anagram
是其中的命名空间,则定义一个名为anagram
的函数来返回一个可以调用方法matches
的对象:
namespace anagram {
SomeType anagram(string n) { return SomeType(n); }
};
这也可以是命名空间anagram
内的类名anagram
。
那不可能是一个静态方法,因为除了ctors之外没有任何方法可以使用类的名称作为标识符。
答案 2 :(得分:1)
它可以使用您已经显示的语法的一种方法是将类anagram
放在类似命名的命名空间中:
#include <string>
namespace anagram
{
class anagram
{
public:
anagram(std::string s) {}
};
}
int main()
{
auto subject = anagram::anagram("diaper");
}
答案 3 :(得分:1)
语法实际上与Java中的方式类似(当然除new
外):
auto subject = Anagram("diaper");
但是有一种更简单的方法:
Anagram subject("diaper");
Anagram subject{"diaper"}; // C++11 and newer
另请注意,如果Anagram
有一个默认构造函数,它将在您定义时构造 - 它不能是null
或类似java中的内容,除非您使用{{1指针。
*
您也可以构建一个临时的Anagram subject;
对象,这样您就不需要定义Anagram
变量了:
subject
如果您想使用动态分配,可以使用auto matches = Anagram{"diaper"}.matches({"hello", "world", "zombies","pants"});
,但是当您不再需要时,没有任何GC可以删除该值...!
new
如果你想使用动态内存分配,我建议你使用智能指针,你可以在cpprefrence page找到它。它们比手动内存分配有许多优点。