"没有合适的构造函数"

时间:2017-02-25 22:51:26

标签: c++

这是我的代码,Visual Studio一直告诉我"没有合适的构造函数"

@SmallTest
@Test
public void testUsesNoV1MapLibrary() {
    packageInfo = context.getPackageManager().getPackageInfo(
        PackageManager.GET_SHARED_LIBRARY_FILES
    ); 

    final ApplicationInfo applicationInfo = packageInfo.applicationInfo;
    String[] sharedLibraries = applicationInfo.sharedLibraryFiles;

    if (sharedLibraries != null) {
        for (String libraryPath : sharedLibraries) {
            assertThat("no com.google.android.maps.jar in use", libraryPath.contains("com.google.android.maps"), is(false));
        }            
    }
}

我的猜测是我错过了节点的默认构造函数,但我觉得我不需要它,因为编译器会为你安装一个。不知道什么是错的

6 个答案:

答案 0 :(得分:0)

添加

Node::Node()
{
  number = 0;
  left = 0;
  right = 0;
};

如注释中所述,如果定义自定义构造函数,则不会添加默认构造函数。

另外,如下所述,这个

Node::Node() : number(0), left(nullptr), right(nullptr) {}

效率更高,我推荐。

答案 1 :(得分:0)

如果定义构造函数,则需要定义默认构造函数。从C ++ 11开始,你可以使用默认关键字

强制一个

答案 2 :(得分:0)

您可以简单地强制编译器生成默认构造函数:

struct Node 
{
    Node(int a, int b, int c);
    Node() = default; // <<<<<<<<<<<<<<<
    // ...
};

一旦声明自己的构造函数,编译器就不会生成默认构造函数。

答案 3 :(得分:0)

在C ++中,如果定义自己的构造函数,则会禁用默认构造函数。因此,如果您有自己的构造函数,则无法调用默认构造函数。

如果你也需要默认的构造函数,你也必须实现它。

这样做:

Node::Node()
{
  left = //default value
  right = //default value
  number = //default value
}

答案 4 :(得分:0)

您可以更新现有的构造函数,如:

Node::Node(int a = 0, int b = 0, int c = 0) : number(a), left(b), right(c)
{

};

使用此定义,您可以按以下方式创建对象:

Node* n1 = new Node;
Node* n2 = new Node(2, 3, 5);

答案 5 :(得分:-1)

您的向量中似乎需要n个元素,而不是2 * n元素。您的代码目前尝试使用n元素预填充向量,但由于没有默认的Node值而失败,而然后您尝试插入另一个n元素} elements。

如果您将逻辑修复为而不是开头的向量中有任何元素,那么您也不需要默认构造函数。只需替换BST的定义:

vector<Node> BST;
for (int i = 0; i != n; ++i) {
  // ...
  BST.push_back(some_value);
}

您的代码还有其他问题(包括明显的内存泄漏)。这些是您的程序的改进版本,您可以在自己的时间内分开,而不是详细说明它们:

struct Node {
    Node(int a, int b, int c) : left(b), right(c), number(a) {}

    int left;
    int right;
    int number;
};

#include <cstdlib>
#include <iostream>
#include <vector>

int main() {
    int n, number, left, right;
    if (!(std::cin >> n)) { std::cerr << "Input error!\n"; std::abort(); }

    std::vector<Node> BST;

    for (int i = 0; i < n; i++) {
        if (!(std::cin >> number >> left >> right)) {
            std::cerr << "Input error!\n"; std::abort();
        }
        BST.emplace_back(number, left, right);
    }

    for (const Node& node : BST) {
        std::cout << node.number << "\n";
    }
}