将派生类变量添加到向量<;基类>; 我学习了一种新的语言C++,它的知识来自java ,而不是JavaScript < /Cord>。 我正在尝试使用派生类CmdHelp创建名为Command的父类。 在java中,我将创建一个名为Command.java的抽象类,并将类CmdHelp.java扩展到Command,在CmdHelp的构造函数中。java我将在Command.java的内部创建一个静态ArrayList,它将像这样添加自己 public CmdHelp() { // Set protected variables here like label, usage, and description for the CmdHelp class. cmds.add(this); } 这是java,我试图把它镜像C++。当我在命令.h头文件中,然后在CmdHelp.cpp构造函数中创建一个静态向量变量时 CmdHelp::CmdHelp() { cmds.push_back((Command) *this); }

将派生类变量添加到向量<;基类>; 我学习了一种新的语言C++,它的知识来自java ,而不是JavaScript < /Cord>。 我正在尝试使用派生类CmdHelp创建名为Command的父类。 在java中,我将创建一个名为Command.java的抽象类,并将类CmdHelp.java扩展到Command,在CmdHelp的构造函数中。java我将在Command.java的内部创建一个静态ArrayList,它将像这样添加自己 public CmdHelp() { // Set protected variables here like label, usage, and description for the CmdHelp class. cmds.add(this); } 这是java,我试图把它镜像C++。当我在命令.h头文件中,然后在CmdHelp.cpp构造函数中创建一个静态向量变量时 CmdHelp::CmdHelp() { cmds.push_back((Command) *this); },c++,vector,C++,Vector,它似乎没有将实例添加到向量列表中。贝娄是我的C++代码和文件。 main.cpp CmdHelp.cpp #包括“CmdHelp.h” #包括 #包括 使用名称空间std; CmdHelp::CmdHelp(){ 设置标签(“帮助”); setUsage(“/help”); setDescription(“显示帮助屏幕!”); cmds.push_back((命令)*此命令); } void CmdHelp::run(){ cout Command.obj:错误LNK2001:未解析的外部符

它似乎没有将实例添加到向量列表中。贝娄是我的C++代码和文件。 main.cpp

CmdHelp.cpp

#包括“CmdHelp.h”
#包括
#包括
使用名称空间std;
CmdHelp::CmdHelp(){
设置标签(“帮助”);
setUsage(“/help”);
setDescription(“显示帮助屏幕!”);
cmds.push_back((命令)*此命令);
}
void CmdHelp::run(){
cout Command.obj:错误LNK2001:未解析的外部符号“public:static class std::vector>Command::cmds”(?cmds@Command@@2V$vector@PEAVCommand@@V$allocator@PEAVCommand@@@std@@@std@@A)


1> C:\Users\Dennis\Documents\Projects\cppttutorial\cppttutorial\x64\Debug\cppttutorial.exe:致命错误LNK1120:1未解决的外部问题

static vector<class Command> cmds;
您不必编写
类命令
,类是由
命令
作为一个类所暗示的。但是,由于您打算将此向量与
命令
的子类打包,您可能需要

static std::vector<std::unique_ptr<Command>> cmds;
<>但是这会让你在清理命令时从代码中删除命令,CMDDS 和程序退出。C++在你喜欢java之后不清理。 下一位是Include-Guards。您可能只遗漏了这些,但是不要
。#Include
的基本意思是“在编译之前将命名文件粘贴到这里”.Include防护可防止同一文件被多次包含,并导致无限包含循环、重复定义和其他不良行为

以下是有关Include Guard的一些信息:

,

如果有更多的问题,你必须列出你遇到的“奇怪的错误”

C++的东西,在java中,所有的东西都是虚拟的,除非是代码>最终的<代码>。我认为它是代码>最终< /代码>。我已经做了一段时间的java。C++中,没有任何东西是虚拟的,除非你说它是。这意味着你会因为java代码没有声明一个虚拟析构函数而被破坏为nase>命令< <代码> > < /p>
virtual ~ Command()
{
    // does nothing
}
没有它,将运行错误的析构函数,或者析构函数数量不足


使用namespace std;
是不好的。它在标题中非常糟糕:

您可能遇到的第一点意外麻烦是

static vector<class Command> cmds;
您不必编写
类命令
,类是由
命令
作为一个类所暗示的。但是,由于您打算将此向量与
命令
的子类打包,您可能需要

static std::vector<std::unique_ptr<Command>> cmds;
<>但是这会让你在清理命令时从代码中删除命令,CMDDS 和程序退出。C++在你喜欢java之后不清理。 下一位是Include-Guards。您可能只遗漏了这些,但是不要
。#Include
的基本意思是“在编译之前将命名文件粘贴到这里”.Include防护可防止同一文件被多次包含,并导致无限包含循环、重复定义和其他不良行为

以下是有关Include Guard的一些信息:

,

如果有更多的问题,你必须列出你遇到的“奇怪的错误”

C++的东西,在java中,所有的东西都是虚拟的,除非是代码>最终的<代码>。我认为它是代码>最终< /代码>。我已经做了一段时间的java。C++中,没有任何东西是虚拟的,除非你说它是。这意味着你会因为java代码没有声明一个虚拟析构函数而被破坏为nase>命令< <代码> > < /p>
virtual ~ Command()
{
    // does nothing
}
没有它,将运行错误的析构函数,或者析构函数数量不足


java java,但是,这不是一个Java问题,实际上这不是Java问题,所以我删除了你的标签,避免了任何混淆。不要试图在C++中模仿Java,它会很糟糕。不要假设C++中类似的结构做JAV中的事情。不要认为你可以在C++中编码,因为你知道java,它会很糟糕。回到你的书,忘记你所知道的关于java的一切,开始阅读C++。谢谢,我会“消灭”。我的java java C++经验,只练习C++,所以我可以说JAVA。是的,你提到java,但这并不是Java问题,事实上,它不是,所以我删除了你的标签,避免了任何混淆。不要试图在C++中模仿java,它会很糟糕。不要假设C++中类似的结构做了Java中的事情,它会被E不要假设你可以在C++中编码,因为你知道java,它会很糟糕地结束。回到你的书,忘记你所知道的关于java的所有知识,开始阅读C++。谢谢。我的java经验,只练习C++,所以我可以得到JIST。我仍然在得到同样的错误。它没有告诉我它刚才说的是什么行。错误是在EXE文件中。这是因为链接器不知道行。到链接器开始工作的时候,它正在处理编译的对象,或者在对象文件中存在一个名称。不是。您是否在Command.cpp中放置了
vector Command::cmds;
?我仍然会收到相同的错误
vector<Command> Command::cmds;
static std::vector<std::unique_ptr<Command>> cmds;
vector<std::unique_ptr<Command>> Command::cmds;
static std::vector<Command*> cmds;
virtual ~ Command()
{
    // does nothing
}