我浏览了类似的其他问题,似乎找不到相关的原因,这里是我认为相关的代码:(编辑:根据要求包括所有代码)
main.cpp
#include <iostream>
#include "Pitri.h"
int main()
{
std::cout << "Hello World!\n";
}
Pitri.cpp
#include "Pitri.h"
#include "node.h"
#include "dood.h"
//#include <cstdlib>
#include <iostream>
Pitri::Pitri()
{
this->length = 0;
this->head = NULL;
}
Pitri::~Pitri()
{
}
void Pitri::add(dood data)
{
node* nnode = new node();
nnode->data = data;
nnode->next = this->head;
this->head = nnode;
this->length++;
}
void Pitri::remove(node * t, node* p)
{
if (this->head == t)
{
if (t->next == NULL)
this->head = NULL;
else
this->head = t->next;
t->data.Death();
free(t);
}
else
{
if (t->next == NULL)
p->next = NULL;
else
p->next = t->next;
t->data.Death();
free(t);
}
}
void Pitri::printP()
{
int tallyBr = 0;
node* head = this->head;
int i = 1;
while (head)
{
}
}
void Pitri::printS()
{
}
void Pitri::printBL()
{
}
void Pitri::populate(int x)
{
for (int i = 0; i < x; i++)
{
dood* baby = new dood;
this->add(baby);
}
}
void Pitri::cycle(int x)
{
//Initial definition in the event that the head node reproduces
node* curr = this->head;
node* mate = this->head->next;
for (int i = 0; i < x; i++)
{
int deaths = 0;
int births = 0;
if (head == NULL)
{
cout << "Pitri has gone extinct!" << endl;
break;
}
while (curr)
{
if (rand() % 100 + 1 <= this->mort && this->mort)
{
deaths++;
remove(curr);
}
else if (curr->data.GetAge() == this->ttl && this->ttl)
{
deaths++;
remove(curr);
}
else if (rand() % 100 + 1 <= this->birth && this->birth)
{
births++;
add(curr->data.Reproduce(mate->data));
}
if (curr->next == NULL)
break;
mate = curr;
curr = curr->next;
}
}
}
Pitri.h
#pragma once
class Pitri
{
public:
Pitri();
~Pitri();
int length;
node *head;
void add(dood data);
void remove(node* t);
void printP();
void printS();
void printBL();
void populate(int);
void cycle(int);
int getBB();
int getBL();
int getLL();
private:
int ttl,mort,birth;
};
dood.cpp
#include "dood.h"
//#include <stdio.h>
//#include <stdlib.h>
#include <time.h>
bool dood::init = false;
dood::dood()
{
if (!init)
{
//Set time for random seed
srand(time(0));
init = true;
}
Primary = rand()%2;
//Set Blue eyes to always have Blue recessive.
if (Primary == 0)
Secondary = rand()%2;
else
Secondary = 1;
}
dood::dood(int a, int b)
{
if (!init)
{
//Set time for random seed
srand(time(0));
init = true;
}
Primary = a;
Secondary = b;
}
dood::~dood()
{
}
void dood::Mutate()
{
this->Primary = rand()%2;
//Set Blue eyes to always have Blue recessive.
if (Primary == 0)
Secondary = rand()%2;
else
Secondary = 1;
}
dood dood::Reproduce(dood donor)
{
int dPri = donor.GetPrimary();
int dSec = donor.GetSecondary();
int bPri, bSec;
int punitvalue = rand() % 4 + 1;
//if at least one dood has Brown/Brown...
if((Primary == 0 && Secondary == 0) || (dPri == 0 && dSec == 0))
{
bPri = 0;
// if other is Br/Br
if (Secondary == dSec)
bSec = 0;
//if other is Br/Bl
else if (Primary == dPri)
bSec = punitvalue % 2;
//if other is Bl/Bl
else
bSec = 1;
}
else if ((Primary == 1 && Secondary == 1) || (dPri == 1 && dSec == 1))
{
bSec = 1;
if (dPri == Primary)
bPri = 1;
else
bPri = punitvalue % 2;
}
else
{
if (punitvalue == 4)
{
bPri = 1;
bSec = 1;
}
else
{
bPri = 0;
if (punitvalue % 3 == 0)
bSec = 0;
else
bSec = 1;
}
}
dood baby = new dood(bPri, bSec);
return baby;
}
void dood::Death()
{
}
void dood::Age()
{
age = age + 1;
}
int dood::GetPrimary()
{
return this->Primary;
}
int dood::GetSecondary()
{
return this->Secondary;
}
int dood::GetAge()
{
return age;
}
dood.h
#pragma once
class dood
{
public:
dood();
dood(int, int);
~dood();
void Mutate();
dood Reproduce(dood);
void Death();
void Age();
int GetPrimary();
int GetSecondary();
int GetAge();
private:
// Genetec Traits "0" for brown, "1" for Blue
int Primary;
int Secondary;
int age=0;
//Has rand() been seeded?
static bool init;
};
node.cpp
#include "node.h"
node::node()
{
}
node::~node()
{
}
node.h
#pragma once
class node
{
public:
node();
~node();
node* next;
dood data;
};
我没有在人们看到的最常见问题的任何地方使用namespace.std,并且在其他任何地方都未预定义AFAIK节点吗?我可以找到方向吗?
答案 0 :(得分:0)
感谢WhozCraig,完成我的Pitri类所需的简单解决方法包括:
#include "node.h"
#include "dood.h"
在头文件中,而不在CPP文件中。
答案 1 :(得分:0)
您不能正确地连接从属标头,更糟糕的是,您正在沿着包含标头的间接标头的悲惨道路驾驶着尖叫着乘客的公共汽车。请记住,CPP预处理器仅是智能文本替换系统。即当您看到
source.cpp
#include "something.h"
void foo() { }
.h看起来像这样:
something.h
class XYZ {};
经过预处理的最终翻译单元如下:
class XYZ {};
void foo() { }
如果相反,您的代码看起来像这样(不要问):
source.cpp
void foo() { }
#include "something.h"
结果将是:
void foo() { }
class XYZ {};
每个标头都应包含所有标头,包括标准标头和自定义标头(您的),要成功编译包含标头,则需要 ,该标头包含在带有没有其他内含物。
示例:
Pitri.h
#pragma once
class Pitri
{
public:
Pitri();
~Pitri();
int length;
node *head; <=== here
void add(dood data); <=== here
void remove(node* t); <=== here
void printP();
void printS();
void printBL();
void populate(int);
void cycle(int);
int getBB();
int getBL();
int getLL();
private:
int ttl,mort,birth;
};
上面的<=== here
标记显示了此标头所依赖的内容。因此,在遇到这些标头之前,必须 或将其预先声明。
修复了Pitri.h
#pragma once
#include "node.h"
#include "dood.h"
class Pitri
{
public:
Pitri();
~Pitri();
int length;
node *head;
void add(dood data);
void remove(node* t);
void printP();
void printS();
void printBL();
void populate(int);
void cycle(int);
int getBB();
int getBL();
int getLL();
private:
int ttl,mort,birth;
};
现在,有人可以这样做:
#include "Pitri.h"
// use anything to do with class Pitri here.
代码将编译。
继续此操作,我们来到node.h,然后再次遇到相同的问题:
node.h
#pragma once
class node
{
public:
node();
~node();
node* next;
dood data; <=== here
};
因此...
修复了node.h
#pragma once
#include "dood.h"
class node
{
public:
node();
~node();
node* next;
dood data;
};
最后,主题包括以翻译单位(您的cpp文件)正确的标题。一般做法是:
第二个和第三个选项应该进行一些解释,并给出一个简单的示例。假设标题"foo.h"
中有一些内容,该内容需要<map>
中的内容。不注意,您可以这样做:
foo.h
std::map<int,int> mapfoo();
foo.cpp
#include <map>
#include "foo.h"
这是我的朋友,是隐式标头依赖项。坏。包含cpp文件是唯一允许foo.h
编译到此转换单元中时编译的文件,并且仅是因为首先包含了<map>
。当有人在没有foo.h
的情况下加入<map>
时,这种问题会变得很棘手,所以要做到这一点。如果您这样做:
foo.cpp
#include "foo.h"
#include <map> // used somewhere down there.
现在在编译foo.h
并包含在cpp中时会崩溃,因为编译器不知道map
是什么。现在,“修复”更加清晰。不要像这样建立包含顺序的依存关系。相反:
foo.h
#include <map>
std::map<int,int> mapfoo();
foo.cpp
#include "foo.h"
#include <map> // optional , leave out unless maps are use regardless of `foo.h` stuff
最终,您对标头的管理方式将有所不同,但是这种机制是可靠的,并且具有适当的include-guards(或者如果您的工具链支持,则为pragma),将在确保代码依赖关系最小的情况下引入最小的构建性能损失。正确维护。
希望有帮助。