|
Related YoLinux tutorials:
°Linux and C++
°C++ enumerations
°C++ Templates
°C++ STL
°C++ STL Map
°C++ String Class
°C++ Singleton
°C++ Coding Style
°C++ XML Beans
°C/C++ Dynamic Memory
°C++ Memory Corruption
°C/C++ Signal Handling
°C++ CGI
°Software development tools
°Advanced VI
°Emacs and C/C++
°YoLinux Tutorials Index
Free Information Technology Magazines and Document Downloads
Free Information Technology Software and Development Magazine Subscriptions and Document Downloads
|
Simple example of a program using C++, a structure and a constructor:
-
// File: struct-test.cpp
//
// This example shows the use of a structure in C++ and how it behaves much
// like a class including the use of a contructor yet maintains the useability
// of a regular C structure.
#include <iostream>
#include <string>
using namespace std;
main()
{
struct DataElement {
string SVal;
int iVal;
bool hasData;
DataElement() // Example of a constructor used in a structure.
{
iVal=-1;
hasData=0;
}
} *RealData;
RealData = new DataElement [ 5 ];
// Assignment
RealData[0].SVal = "Value loaded into first structure element.";
RealData[0].hasData = 1; // True
cout << "First element 0: " << RealData[0].SVal << endl;
cout << " " << RealData[0].hasData << endl;
cout << "Second element 1: " << RealData[1].SVal << endl;
cout << " " << RealData[1].hasData << endl; // Show effect of contructor
cout << " " << RealData[1].iVal << endl; // Show effect of contructor
delete [] RealData; // Or: delete [5] RealData;
}
|
Compile: g++ struct-test.cpp
[Potential Pitfall]: In Red Hat Linux versions 7.x
one could omit the "using namespace std;" statement. Use of this
statement is good programming practice and is required in Red Hat 8.0.
[Potential Pitfall]: Red Hat 8.0 requires
the reference to "#include <fstream>". Red Hat versions 7.x
used "#include <fstream.h>".
Output: ./a.out
-
First element 0: Value loaded into first structure element. 1 Second element 1: 0 -1
The same example using typedef and a C++ initializer:
-
#include <iostream>
#include <string>
using namespace std;
typedef struct dataElement {
string SVal;
int iVal;
bool hasData;
dataElement() // Example of a constructor used in a structure.
: iVal(-1), hasData(0)
{}
} DataElement;
main()
{
DataElement *RealData;
RealData = new DataElement [ 5 ];
RealData[0].SVal = "Value loaded into first structure element.";
RealData[0].hasData = 1; // True
cout << "First element 0: " << RealData[0].SVal << endl;
cout << " " << RealData[0].hasData << endl;
cout << "Second element 1: " << RealData[1].SVal << endl;
cout << " " << RealData[1].hasData << endl; // Show effect of contructor
cout << " " << RealData[1].iVal << endl; // Show effect of contructor
delete [] RealData; // Or: delete [5] RealData;
}
|
Identical results as above example.
By contrast the typical "C" structure initialization is as follows:
-
#include <stdio.h>
typedef struct dataElement {
char *cVal;
int iVal;
} DataElement;
main()
{
DataElement RealData = {"Text goes here", 5 }; // "C" style initialization.
printf("%s \nInteger value=%d\n",RealData.cVal,RealData.iVal);
}
|
Compile: gcc struct-simple.c -o gcc struct-simple
Run: ./struct-simple
-
Text goes here Integer value=5
C++ structure notes:
- The struct can employ a constructor to initalize variables.
- The struct can employ a destructor.
- The structure constructor can not be declared virtual.
- Structure member variables are public by default.
The following example shows how a "C" union can be used with a constructor to initialize data.
-
#include <stdio.h>
typedef union uAA
{
double dVal;
int iVal[2];
uAA() : dVal(3.22) {}
} UAA;
main()
{
UAA rdata;
printf("Array output: %d %d \nDouble output: %lf \n",
rdata.iVal[0], rdata.iVal[1], rdata.dVal);
}
|
Compile: g++ union-test.cpp -o union-test
Run: ./union-test
-
Array output: 1546188227 1074381455 Double output: 3.220000
[Potential Pitfall]: The C++
difference - Structures used with union. A struct can NOT be used with
a constructor if it is to be used in a union. The C++ recognition of
the constructor in a struct converts it to a C++ class which is not
valid in a "C" union.
-
Typical use of a "C" union:
#include <stdio.h>
typedef struct
{
int iVal1;
int iVal2;
} DataElement;
typedef union
{
DataElement de;
int iVal[2];
} UAA;
main()
{
UAA rdata;
rdata.de.iVal1 = 0;
rdata.de.iVal2 = 1;
printf("Array output: %d %d \n",
rdata.iVal[0], rdata.iVal[1]);
}
|
Compile: gcc -o union-test union-test.c
Note: Compiles properly with the gcc and g++ compiler.
Run: ./union-test
Array output: 0 1
|
Use of C++ structure (with constructor) in a union:
#include <stdio.h>
typedef struct dataElement
{
int iVal1;
int iVal2;
dataElement() : iVal1(1), iVal2(2){};
} DataElement;
typedef union
{
DataElement de;
int iVal[2];
} UAA;
main()
{
UAA rdata;
printf("Array output: %d %d \n",
rdata.iVal[0], rdata.iVal[1]);
}
|
Compile: g++ -o union-test union-test.cpp
-
union-test.cpp:13: error: member `DataElement ::de' with constructor not allowed in union
|
C++ union notes:
- The union can employ a constructor to initalize variables.
- The union can employ a destructor.
- Union member functions can NOT be declared virtual.
- Union member variables are public by default.
- A union's data members can NOT be declared static.
- A union can not be used as a base class.
Why a tutorial on such a simple subject? While simple, it has
been overlooked by every C++ book I have ever seen. Many programmers I
have met didn't know that
constructors could be used with a C structure. I didn't know until I
was
told by another programmer. It was not covered by my professor nor was
it
in our very thourough C++ text book. This is just an FYI.
Books: |
-
 |
C++ How to Program
by Harvey M. Deitel, Paul J. Deitel
ISBN #0131857576, Prentice Hall
Fifth edition.
The first edition of this book (and Professor Sheely at UTA) taught me to
program C++. It is complete and covers all the nuances of the C++ language.
It also has good code examples. Good for both learning and reference.
|
|
|
|