Redefinition of class types - c++
I understand the problem I'm having with my code, but trying some of the things that others are suggesting isn't fixing my error.
Here's my error messages:
In file included from proj07.driver.cpp:4:
proj07.string.cpp:10: error: redefinition of 'String::String()'
/user/cse232/Projects/project07.string.h:25: error: 'String::String()' previously defined here
proj07.string.cpp: In constructor 'String::String(const char*)':
proj07.string.cpp:19: error: expected primary-expression before 'char'
proj07.string.cpp:19: error: expected `;' before 'char'
make: *** [proj07.driver.o] Error 1
Here's the one I'm worried about:
proj07.string.cpp:10: error: redefinition of 'String::String()'
/user/cse232/Projects/project07.string.h:25: error: 'String::String()' previously defined here
I know I'm supposed to have my interface file defined once, but I am not sure what to change because everything I try is bringing more problems.
My driver(proj07.driver.cpp):
using namespace std;
#include <iostream>
#include "proj07.string.cpp"
int main()
{
const char string1[] = {'a', 'b', 'c', 'd', 'e', 'f'};
String test1();
String test2(string1);
}
My support file (proj07.support.cpp):
/* Implementation file for type "String" */
using namespace std;
#include <iostream>
#include "/user/cse232/Projects/project07.string.h"
/*Default constructor*/
String::String()
{
Capacity = 0;
Length = 0;
Mem = NULL;
}
String::String( const char[] )
{
cout << char.length[]; //Function not implemented yet
}
My makefile:
#
# Project 07
#
proj07.exe: proj07.driver.o proj07.string.o
g++ -o proj07.exe proj.driver. proj07.string.o
proj07.driver.o: proj07.driver.cpp ~cse232/Projects/project07.string.h
g++ -Wall -c proj07.driver.cpp
proj07.string.o: proj07.string.cpp ~cse232/Projects/project07.string.h
g++ -Wall -c proj07.string.cpp
clean:
rm -f proj07.*.o proj07.exe
And the header file - this one includes a lot of class functions I haven't done yet. It is unalterable.
/******************************************************************************
Project #7 -- Interface file for type "String"
******************************************************************************/
#ifndef STRING_
#define STRING_
using namespace std;
#include <iostream>
class String
{
private:
unsigned Capacity; // Number of memory locations reserved
unsigned Length; // Number of memory locations in use
char * Mem; // Pointer to memory to hold characters
public:
// Construct empty string
//
String()
{
Capacity = 0;
Length = 0;
Mem = NULL;
}
// Reset string to empty
//
void reset() { Length = 0; }
// Return string capacity and length
//
unsigned capacity() const { return Capacity; }
unsigned length() const { return Length; }
// Return string status
//
bool empty() const { return Length == 0; }
// Return reference to element I
//
char& operator[]( unsigned I ) { return Mem[I]; }
// Return constant reference to element I
//
const char& operator[]( unsigned I ) const { return Mem[I]; }
// Destroy string
//
~String();
// Construct string by copying existing string
//
String( const String& );
// Construct string by copying C-style character string
//
String( const char[] );
// Copy string into the current string
//
String& operator=( const String& );
// Append string to the current string
开发者_如何学Go //
String& operator+=( const String& );
};
// Return string which is the concatenation of two strings
//
String operator+( const String&, const String& );
// Compare two strings (equality and relational operators)
//
bool operator==( const String&, const String& );
bool operator< ( const String&, const String& );
// Output string to stream
//
ostream& operator<<( ostream&, const String& );
// Input string from stream
//
istream& operator>>( istream&, String& );
#endif
I understand the problem has something to do with my #include statements, but I'm mixed up about which ones to change. If someone can show me what I'm doing wrong, I'd be very grateful. Thank you!
#include "proj07.string.cpp"
You need to include the header file, not the .cpp file. If you include the .cpp file, which presumably contains definitions in it, in multiple .cpp files, then when you build, you'll get multiple definition errors (because things are defined more than once in different .cpp files).
In addition to what James McNellis said, you defined the default constructor in two different places:
In project07.string.h
:
class String
{
private:
unsigned Capacity; // Number of memory locations reserved
unsigned Length; // Number of memory locations in use
char * Mem; // Pointer to memory to hold characters
public:
// Construct empty string
//
String()
{
Capacity = 0;
Length = 0;
Mem = NULL;
}
/* ... */
};
And in proj07.support.cpp
:
#include "/user/cse232/Projects/project07.string.h"
/*Default constructor*/
String::String()
{
Capacity = 0;
Length = 0;
Mem = NULL;
}
Since you included string.h
within support.cpp
, the compiler sees two different implementations of String
's default constructor, which violates the One Definition Rule.
Some comments unrelated to your problem:
I know you can't alter project07.string.h
, but it really should not have a using namespace std
like that in it. It makes it so that any file that includes project07.string.h
will have the entire std
namespace dumped into it, increasing the probability that one of your identifiers will clash with it.
Also, it appears that the class declaration only needs a forward declaration of ostream
and istream
. In that case, you would only need to #include <iosfwd>
, instead of the entire <iostream>
.
Your String
constructor is, as the message states, defined twice. Once in the class definition:
class String {
// Construct empty string
//
String()
{
Capacity = 0;
Length = 0;
Mem = NULL;
}
};
and once in the string.cpp
file, as such:
String::String()
{
Capacity = 0;
Length = 0;
Mem = NULL;
}
Also, you might want to include string.h
in your main program, not main.cpp
or you will get linker errors with your current makefile.
精彩评论