c++ - 在 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();
}
解决方案
您收到评论而不是答案的原因是因为您
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++ 程序员也会在尝试这样的优化之前尝试让他们的代码正常工作。没有办法预测它是否需要,所以总是在之前和之后进行基准测试。
推荐阅读
- django - 在视图中获取 virtualenv 或 python 路径
- java - 将构建定义移动到子文件夹中
- windows - 如何在 Windows 上将 FIG 文件与 Matlab 相关联,这样它就不会打开新的 Matlab 副本?
- javascript - 在 .HTA 中,获取带有大写标签和不带引号的属性的页面 html
- javascript - 我们可以为拖放/选择文件编写相同的代码吗
- java - Java、MySQL:myStatement.executeUpdate INSERT INTO 给出 NullPointerException
- matlab - 将 MATLAB 帮助浏览器的编码更改为 UTF-8?
- c# - C#- 检查堆栈是否有足够的可用内存
- python - Tkinter GUI 很多入口小部件,有没有更好的方法?
- c# - 如何确定所有排列 &| 层次结构中的组合