首页 > 解决方案 > 在 C++ 的标题顶点中定义列表

问题描述

我遇到了这个错误的定义语法问题List,我尝试创建一个列表Vertice并且我的语法有问题,我STD也尝试在标题中使用命名空间但仍然收到错误:严重性代码描述项目文件行抑制状态错误(活动)E0415 不存在合适的构造函数来将“std::list> *”转换为“std::list>” graf C:\Users\danie\OneDrive\Desktop\graf\graf\Vertice.cpp 39

在此处输入图像描述

顶点.h

  #pragma once
  #include <list>
  #include <iostream>
  class Vertice {
  std::list<Vertice> getList();
  void setList(Vertice v);

  private:
    std::list<Vertice> *N;
   };

顶点.cpp

#pragma once
#include <list>
#include <iostream>
#include "Vertice.h"

using namespace std;

Vertice::Vertice(int b, int f) {
  N = new list < Vertice > ();
  color = 0;
}

list < Vertice > Vertice::getList() {
  return  N;
}
void Vertice::setList(Vertice v) {
  this - > N - > push_front(v);
}
Vertice::~Vertice() {
  N - > clear();
}

标签: c++listvertices

解决方案


您收到评论而不是答案的原因是因为您
a)没有发布错误消息(如评论中所述)
b)您的代码包含许多错误和一些反模式。

在 C++ 中使用命名空间时,约定是在标题中使用完整的命名空间

std::list<Vertice> *N; // member declaration

和模块中的“使用”声明。

using namespace std;
...
list<Vertice> Vertice::getList() const // return by value, mark as const
{
    return N; // you don't need this->N in C++ 
}

然而,许多人更喜欢总是简单地输入完整的命名空间,所以如果你觉得这更容易理解,请尝试使用它。

你想用这段代码实现什么?我问的原因是因为动态分配“std::list”有点奇怪。“std::list”旨在为您管理内存,这使得这段代码读起来有点像“分配一个指针来保存我要分配的内存地址”。我强烈怀疑您正在尝试制作递归结构(一棵树)。令人惊讶的是,C++ 不需要您使用指针来执行此操作(C 确实如此)。也许这种模式会有所帮助?

class NTree
{
private:
  std::list<NTree> children;
};

我建议你先让你的代码像那样工作。如果需要优化,您将更多地控制内存,那么这样的事情会有所帮助。

class NTree
{
private:
  std::vector<std::unique_ptr<NTree>> children;
};

例如,这将允许您以安全的方式将子节点从一个节点 (NTree) 移动到另一个节点 (NTree - 或其他)。这避免了任何复制开销。这是一个很小的节省,除非您的树变得非常大或者它们包含非常大的对象。即使是专业的 C++ 程序员也会在尝试这样的优化之前尝试让他们的代码正常工作。没有办法预测它是否需要,所以总是在之前和之后进行基准测试。


推荐阅读