用c ++构造对象

时间:2016-10-13 17:55:04

标签: c++ object constructor static

所以,我来自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相似,但这对我来说没有意义。所以如果有人能解释这个会很好:)

4 个答案:

答案 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");
}

http://ideone.com/1OVhIz

答案 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找到它。它们比手动内存分配有许多优点。