I can't understand why my compiler is giving me these errors:
brain.cpp:16: error: cannot declare pointer to ‘const class FACT&’
brain.cpp: In constructor ‘FACT::FACT(const FACT*)’:
brain.cpp:20: error: cannot convert ‘FACT**’ to ‘FACT*’ in assignment
brain.cpp: In member function ‘void FACT::AddRelation(FACT*)’:
brain.cpp:29: error: expected type-specifier before ‘*’ token
brain.cpp:29: error: cannot convert ‘int**’ to ‘FACT*’ in initialization
brain.cpp:29: error: expected ‘,’ or ‘;’ before ‘FACT’
brain.cpp:35: error: expected type-specifier before ‘*’ token
brain.cpp:35: error: cannot convert ‘int**’ to ‘FACT*’ in assignment
brain.cpp:35: error: expected ‘;’ before ‘FACT’
brain.cpp: At global scope:
brain.cpp:47: error: expected unqualified开发者_如何学编程-id before ‘=’ token
brain.cpp:48: error: expected type-specifier before ‘*’ token
brain.cpp:48: error: cannot convert ‘int**’ to ‘FACT*’ in initialization
brain.cpp:48: error: expected ‘,’ or ‘;’ before ‘FACT’
brain.cpp: In function ‘void AddFact(FACT*)’:
brain.cpp:52: error: cannot convert ‘FACT**’ to ‘FACT*’ in initialization
brain.cpp:58: error: expected type-specifier before ‘*’ token
brain.cpp:58: error: cannot convert ‘int**’ to ‘FACT*’ in assignment
brain.cpp:58: error: expected ‘;’ before ‘FACT’`
#include <iostream>
using namespace std;
class FACT
{
public:
FACT(string f)
{
fact=f;
relations=NULL;
num_relations=0;
};
~FACT()
{
delete[] relations;
};
FACT(const FACT& *copy)
{
num_relations=copy->num_relations;
delete[] relations;
relations=new FACT*[num_relations];
for (int x=0; x<=num_relations; x++)
{
relations[x]=copy->relations[x];
}
fact=copy->fact;
};
void AddRelation(FACT *fact)
{
FACT *copy=new *FACT[num_relations];
for (int x=0; x<=num_relations; x++)
{
copy[x]=relations[x];
}
delete[] relations;
relations=new *FACT[num_relations+1];
for (int x=0; x<=num_relations; x++)
{
relations[x]=copy[x];
}
relations[num_relations+1]=fact;
num_relations++;
};
string fact;
FACT *relations;
int num_relations;
};
FACT *facts=new *FACT[0];
int num_facts=0;
void AddFact(FACT *new_item)
{
FACT *copy=new FACT*[num_facts];
for (int x=0; x<=num_facts; x++)
{
copy[x]=facts[x];
}
delete[] facts;
facts=new *FACT[num_facts+1];
for (int x=0; x<=num_facts; x++)
{
facts[x]=copy[x];
}
delete[] copy;
num_facts++;
facts[num_facts]=new_item;
}
int main()
{
FACT *new_item=new FACT("linux is secure");
AddFact(new_item);
delete[] facts;
return 0;
}
I'm using g++ 4.4.3 I can't understand why it doesn't consider "FACT" to be a data type
You can't declare a pointer to a reference, like you try to do here:
FACT(const FACT& *copy)
There is no such thing as pointers to a reference. Probably you just wanted a reference, without a pointer:
FACT(const FACT& copy)
You are attempting to declare a copy constructor. However it is not correct.
A copy constructor is declared as per the below quote from the Standard
$12.8/2 - "A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&, volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments (8.3.6)."
The parameter of the 'supposed to be copy constructor' has type 'pointer to reference'. This is disallowed by the Standard as per the quote below
$8.3.2/5- "There shall be no references to references, no arrays of references, and no pointers to references."
Well, your first error is here:
FACT(const FACT& *copy)
Can't do that, you want a reference
FACT(const FACT& copy)
Hey, people. It is not all the truth.
Of course @noah can't declare
a pointer to a reference
but the inverse, a reference to a pointer, is allowed.
FACT(const FACT *©)
is a valid syntax and very useful in some situations. Although, it is still a wrong copy constructor.
There are couples of good pages teaching this:
http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr390.htm http://www.fredosaurus.com/notes-cpp/oop-condestructors/copyconstructors.html http://cplus.about.com/od/learning1/ss/constructors.htm
精彩评论