I am implementing bptree using c++. I am am stuck in the initial step of node creation. Keep getting "C2011 'Node':'class' type redefinition" error. I found some suggestions online to remove class key word from cpp file. But when I remove class keyword I get lots of other errors. here is my code for Node.cpp:
#include "Node.h"
#include <cstdio>
#include <iostream>
#include <string>
#include <map>
using namespace std;
class Node {
bool leaf;
Node** kids;
map<int, string> value;
int keyCount;//number of current keys in the node
//constructor;
Node::Node(int order) {
this->value = {};
this->kids = new Node *[order + 1];
this->leaf = true;
this->keyCount = 0;
for (int i = 0; i < (order + 1); i++) {
this->kids[i] = NULL;
}
}
};
and Node.h file is as following:
#pragma once
#ifndef NODE_HEADER
#define NODE_HEADER
class Node {
public:
Node(int order) {};
};
#endif
How can I fix this?
Problem
In C++, headers are simply pasted into the body when you #include. So now the compiler sees:
class Node {
public:
Node(int order) {};
};
// stuff from system headers omitted for brevity
using namespace std;
class Node {
bool leaf;
//...
};
There are two problems here:
compiler sees class Node twice with different bodies.
Node::Node is defined twice (first time empty {}).
Solution
The header should include class declaration:
#include <map>
using namespace std;
class Node {
bool leaf;
Node** kids;
map<int, string> value;
int keyCount;//number of current keys in the node
//constructor;
Node(int order);
};
Note that the constructor has no body here. It's just a declaration. Because it uses map you need to include <map> and add using namespace before the declaration.
After that don't put class Node again in the .cpp or .cc file. Only put the method implementations at the top level:
Node::Node(int order) {
// ...
}
Related
I have a simple c++ app:
node.h:
#include<iostream>
using namespace::std;
class Node
{
private:
int data;
Node *next;
public:
Node(int nodeData,Node *nextNode);
};
node.cpp:
#include "node.h"
Node::Node(int nodeData, Node *nextNode) {
data = nodeData;
next = nextNode;
}
linked_list.h
#include "node.h"
class LinkedList
{
private:
Node *head;
Node *tail;
int size;
public:
LinkedList();
int getSize();
};
linked_list.cpp:
#include "linked_list.h"
LinkedList::LinkedList()
{
size = 0;
}
int LinkedList::getSize() {
return size;
}
main.cpp:
#include <iostream>
#include "node.h"
#include "linked_list.h"
using namespace ::std;
int main()
{
cout << "This is main!\n";
return 0;
}
I am on linux, inside the projcet's directory, I open a terminal there and try to compile them by this command:
g++ *.cpp *.h -o app
but I get this error:
In file included from linked_list.h:1:0,
from main.cpp:3:
node.h:1:7: error: redefinition of ‘class Node’
class Node
^~~~
In file included from main.cpp:2:0:
node.h:1:7: note: previous definition of ‘class Node’
class Node
^~~~
I looked at some posts here on stackoverlfow but had no luck in solving my problem. I am new to c++, I know that the compiler thinks I am redefining class Node somewhere, but where is this somewhere so I can remove the definition?
Your linked_list.h includes node.h, so the compiler will see the definition in node.h twice while compiling main.cpp.
To avoid this problem, you should add "include guard" to your header files.
It should be like this:
node.h:
#ifndef NODE_H_GUARD // add this
#define NODE_H_GUARD // add this
#include<iostream>
using namespace::std;
class Node
{
private:
int data;
Node *next;
public:
Node(int nodeData,Node *nextNode);
};
#endif // add this
The macro name to define and check should be different for each headers.
Another way to avoid this problem is to adding #pragma once as the first lines of your headers if your compiler supports this.
I'm having trouble unsing my AVL tree class in one of my programs, I'm not sure how to include my class and use it with existing code, here is the problem:
I have an AVL tree class: AVL_tree.h and AVL_tree.cpp
I also have a main.cpp file
Also functions.cpp and functions.h, where I store some functions used in main.cpp
So, in main() I create an object from my AVL tree class. I want to pass this object along with some other data (which will serve to change the information stored in the tree) to one of the functions from my functions.cpp. And here is where I can't get it to work. I get several errors like these ones:
main.o:main.cpp|| undefined reference to `AVL_Tree::AVL_Tree()'|
main.o:main.cpp|| undefined reference to `process_vector(std::vector<int, std::allocator<int> >, AVL_Tree&)'|
How can I pass the necessary information to my function in order to modify my tree?
Simplified version of my code files:
main.cpp
#include <vector>
#include "functions.h"
#include "AVL_tree.h"
using namespace std;
int main() {
AVL_Tree tree;
vector<int> V;
V.push_back(11);
V.push_back(4);
V.push_back(7);
process_vector(V, tree);
return 0;
}
functions.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
#include<vector>
#include"AVL_tree.h"
using namespace std;
void process_vector(vector<int> V, AVL_Tree &tree);
#endif // FUNCTIONS_H
functions.cpp
#include<vector>
#include"functions.h"
#include"AVL_tree.h"
using namespace std;
void process_vector(vector<int> V, AVL_Tree &tree){
for(int i=0;i<vector.size();i++){
key = vector[i]
tree.AddLeaf(key);
}
return;
}
AVL_tree.h
#ifndef AVL_TREE_H
#define AVL_TREE_H
class AVL_Tree{
private:
struct node{
int key;
node* left;
node* right;
};
node* root;
node* CreateLeaf(int key);
node* AddLeafPrivate(int key, node* Ptr);
int HeightPrivate(node* Ptr);
int BFactorPrivate(node* Ptr);
public:
AVL_Tree();
void AddLeaf(int key);
int Height(int key);
int BFactor(int key);
};
#endif // TREE
I have created a link list program that performs several functions. I've written a function to destroy the list that takes "top" as a parameter. I eventually use this function in my destructor. Can I actually test this?
Here is my shortened Family.h:
#ifndef FAMILY_H
#define FAMILY_H
#include<string>
using namespace std;
#include "Child.h"
#include "Wife.h"
#include "Husband.h"
class Family
{
protected:
HusPtr top;
void Destroy(HusPtr& top); //I know in order to access this in the Main, I'd have to make
//this Public. But I'd have to create a local pointer named top.
//Because the local pointer points to nothing, I get a segmentation
//fault.
public:
Family();
Family(HusPtr& h);
Family(const Family& source);
~Family();
};
#endif
Here is my Destroy function in my Family.cpp:
void Family::Destroy(HusPtr& top)
{
HusPtr curr = top;
WifePtr w = curr->myWife;
while(curr != NULL)
{
if(curr->myWife != NULL)
{
while(w->myChildren != NULL)
{
ChildPtr c = w->myChildren;
ChildPtr cNext = c->mySibling;
w->myChildren = cNext;
delete c;
}
curr->myWife = NULL;
delete w;
}
HusPtr next = curr;
curr = next->nextFamily;
delete next;
top = curr;
}
}
My Main.cpp:
using namespace std;
#include "Family.h"
HusPtr top; //points to nothing.
int main()
{
Family F1;
F1.ProcessTransaction("transaction.txt");
F1.Destroy(top);// gives a segmentation fault...likely due to the fact that top points to nothing.
}
Wife.h:
#ifndef HUSBAND_H
#define HUSBAND_H
#include<string>
using namespace std;
#include "Person.h"
class Husband;
typedef Husband* HusPtr;
class Wife;
typedef Wife* WifePtr;
class Husband:public Person
{
friend class Wife;
friend class Family;
protected:
HusPtr nextFamily;
WifePtr myWife;
public:
Husband();
Husband(long hSSN, string hFirst, string hLast);
void Print() const;
};
#endif
Wife.h:
#ifndef WIFE_H
#define WIFE_H
#include<string>
using namespace std;
#include "Person.h"
#include "Child.h"
class Child;
typedef Child* ChildPtr;
class Wife:public Person
{
friend class Family;
protected:
ChildPtr myChildren;
public:
Wife();
Wife(long wSSN, string wFirst, string wLast);
void Print() const;
};
#endif
Child.h:
#ifndef CHILD_H
#define CHILD_H
#include<string>
using namespace std;
#include "Person.h"
class Child;
typedef Child* ChildPtr;
class Child:public Person
{
friend class Family;
protected:
ChildPtr mySibling;
public:
Child();
Child(long cSSN, string cFirst, string cLast);
void Print() const;
};
#endif
This is not a needed function in this assignment, but I decided to implement it anyway. Everything maps out fine and should work, but I really think that the segmentation fault I receive is due to the fact that I'm passing a pointer created in Main.cpp that isn't pointing anywhere. Am I correct?
In second iteration after deleting w, you are not assigning it again. But you try to access its children again. so it get crashed.
in while loop
first iteration
...
delete w;
second iteration
w->children; program will be crashed.
I have been receiving this error and it appears to be too vague for a Google search so I am handing it over to you! I am trying to create a linked list object that holds Account objects.
#include "Customer.h"
#include "LinkedList.h"
#include "Account.h"
#include "Mortgage.h"
#include "CurrentAcc.h"
#include "JuniorAcc.h"
#include "transaction.h"
#include <iostream>
#include <string>
using namespace std;
string name;
string address;
string telNo;
char gender;
string dateOfBirth;
list<Account> accList; // Error
list<Mortgage> mortList; //Error
I feel that I am not properly declaring my Linked Lists but cannot think of how else to do it.
The next piece of code I feel is as a result of my bad declaration.
void Customer::openCurrentAccount(int numb, double bal, int cl, string type, double Interest){
Current acc(numb,bal,cl,type,Interest); //Error - Expression must have class type.
accList.add(acc);
}
And here is the creation of my Linked List class .h file.
#pragma once
#include <iostream>
using namespace std;
template <class T>
class node;
template <class T>
class list
{
public:
list() { head = tail = NULL; }
~list();
void add(T &obj);
T remove(int ID);
void print(ostream &out);
T search(int ID);
private:
node<T> *head, *tail;
};
template <class T>
class node
{
public:
node() {next = NULL;}
//private:
T data;
node *next;
};
template <class T>
list<T>::~list()
{
}
You're defining your own class called list in the global namespace, and also putting using namespace std; in its header to dump the entire standard library into the global namespace. This means that you have two templates called list available in the global namespace, which will cause ambiguities and hence compile errors.
You should:
avoid putting using namespace std; in source files
never put it in headers, since it imposes namespace pollution on anyone who uses that header
avoid putting your own declarations in the global namespace
avoid giving your own declarations the same name as things in the standard library
use standard library facilities rather than writing your own versions.
#ifndef SLIST_H
#define SLIST_H
#include "llist.h"
using namespace std;
class slist:public llist{
public:
slist();
int search(el_t Key);
void replace(el_t Elem, int I);
};
#endif
That is my new class I just made that gives me the search and replace function, on top of all the inherited functions contained in llist.h
In my main...
#include "slist.h"
#include <iostream>
using namespace std;
int main(){
slist list;
list.addFront(4);
cout<<list.search(4);
}
I'm trying to call addfront() which is a public function in the llist class. Then I want to call search() which is an inherited public function of the slist class. g++ gives me a few errors that I don't understand.
slist.h: In function âint main()â:
slist.h:10: error: âslist::slist()â is protected
main.cpp:7: error: within this context
slist() is protected? Why's that? I put it under public:
Also whats up with the this context, I'm guessing I'm just doing the whole inheritance thing totally wrong. Any help would be appreciated!
Edit: Here's the llist class, if it helps
#ifndef LIST_H
#define LIST_H
#include <iostream>
using namespace std;
class llist{
protected:
typedef int el_t;
el_t total;
struct Node{
int Elem;
Node *Next;
};
Node *Front;
Node *Rear;
Node * Curr;
public:
class Overflow{};
class Underflow{};
class Range{};
llist();
~llist();
bool isEmpty();
void displayAll();
void addRear(el_t NewNum);
void deleteFront(el_t& OldNum);
void addFront(el_t NewNum);
void deleteRear(el_t& OldNum);
void deleteIth(int I, el_t& OldNum);
void addbeforeIth(int I, el_t newNum);
class Overflow;
};
#endif
This is llist.cpp with only the relevant functions pasted
#include "llist.h"
#include <iostream>
using namespace std;
int total=0;
llist::llist(){
Front=NULL;
Rear=NULL;
total=0;
}
llist::~llist(){
while(Front!=NULL){
int z;
deleteFront(z);
}
}
bool llist::isEmpty(){
if(Front==NULL){
return true;
}
return false;
}
void llist::displayAll(){
Curr=Front;
if(isEmpty()){
cout<<"[ empty ]"<<endl;
}else{
while(Curr!=NULL){\
cout<<"curr != NuL"<<endl;
cout<<Curr->Elem<<endl;
Curr=Curr->Next;
}
}
}
void llist::addFront(el_t NewNum){
if(isEmpty()){
Node *x=new Node;
x->Next=Front;
Rear=Front;
Front=x;
Front->Elem=NewNum;
}else{
Node *x=new Node;
x->Next=Front;
Front=x;
Front->Elem=NewNum;
++total;
}
}
I honestly can't see the problem but not every compiler is standard-compliant, so I would try the following:
1) Rename your class - if it works, that means it's a because of a naming conflict.
2) Remove the using directives.
3) Remove the inheritance. If it works after this... you really need to change compilers.
4) Try #undef public before your class declaration. If it works after this... well, someone's in for a talk with the manager.
5) Pray...