linux-c-programming.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Pointers to classes
@ 2004-06-20  4:46 Eric
  2004-06-20  5:06 ` John T. Williams
  0 siblings, 1 reply; 6+ messages in thread
From: Eric @ 2004-06-20  4:46 UTC (permalink / raw)
  To: linux-c-programming

Hello
	First I would like to say im fairly new to C++ and keep in mind you will 
probably see many glaring mistakes in reading my code, please be kind. Hey, 
thats how we learn :)

	My problem is with pointers to classes. I am writing a VPN management program 
and have a class Connection, which handles a connection ppp0, ppp1, etc, and 
is closely tied with a class ConfigFile, which handles all the variables for 
that connection obviously read from a file.

	I need to have a pointer to an object ConfigFile inside the Connection class 
so I can access variables and such associated with that connection that were 
read from a file. However, I am getting very strange compile errors when 
trying to define the pointer to a class. These are the errors. Below are the 
relevant files and how they are included.

*/home/bot403/programming/projects/vpn_client/src/connection.h:28: error: 
syntax error before `*' token 
*/home/bot403/programming/projects/vpn_client/src/connection.h:31: error: 
parse error before `*' token 
*/home/bot403/programming/projects/vpn_client/src/connection.h:36: error: 
syntax error before `*' token


Here are the relevant files. Please let me know if you need additional 
information. 

BTW, I don't consider making Connection a sublass of configfile a solution 
becuase I am already teaching myself alot with this project and am happy with 
simpleton solutions. Subclasses/Inheritance  would require that I teach 
myself way too much to accomplish way too little.


---------------------start connection.h
class Connection
{
private:
  char ifName[ 5 ];
  char pppdopts[256];
  char sshopts[256];
  char pidfile[256];
  ConfigFile * config;
  pid_t pid;
public:
  Connection(ConfigFile * cFile );
  void printName( void );
  int start();
  int stop();
  ~Connection();
  ConfigFile * getConfig();

};
----------------------- end file
-----------------------start configfile.h
int readElement( char buffer[], char option[], char argument[] );

using namespace std;

class ConfigFile {
 private:
  ifstream configFile;
  char configFileName[ 256 ];

  //File variables
  char pppdevice[ 8 ];
  char vpnhost[ 256 ];
  char logfile[ 256 ];
  char *pppdopts;
  //SSH Specific
  char sshcipher[ 15 ];
  char sshlogin[ 256 ];
  char sshidentity[ 256 ];
  char *sshopts;
  char sshport[ 10 ];
  //Misc
  char delay[ 10 ];
  char vpnpidfile[80];
  //Connection Details
  char *networks[5];
  char *nameservers[2];
  //End File Variables

 public:
  ConfigFile( char *Name );
  ~ConfigFile();
  int readConfig();
  void printConfig();
  int writeConfig(char *Filename);
  
  char *getsshopts(char buffer[]);
  char *getpppdopts(char buffer[]);
  char *getlogfile(char buffer[]);
  char *getpidfile(char buffer[]);
  
  //FIXME
  //char *getnetworks();
  //char *getnameservers();
  

};

-----------end of file
-----------top of connection.cpp

#include <iostream>
#include <fstream>
#include <unistd.h>
#include "configfile.h"
#include "connection.h"
#include "strings.h"
#include "config.h"
------snip---------

-----------------end file

----------------top of configfile.cpp

#include <iostream>
#include <fstream>
#include "configfile.h"
#include "strings.h"
-----snip------------

--------------end of file

^ permalink raw reply	[flat|nested] 6+ messages in thread
* RE: Pointers to classes
@ 2004-06-21 14:55 Huber, George K RDECOM CERDEC STCD SRI
  0 siblings, 0 replies; 6+ messages in thread
From: Huber, George K RDECOM CERDEC STCD SRI @ 2004-06-21 14:55 UTC (permalink / raw)
  To: linux-c-programming

Eric wrote:


> The abstract class worked like a charm! I think I had some weird include 
>problems where they werent going in the order I needed them to and I
couldn't 
>trace it down. Firthermore I didnt want to redefine the class inside 
>connection.h...that would just be silly. But an abstract class worked 
>beautifully.

Actually, the correct term, AFAIR, is a forward declaration.  

An `abstract class' is a class that can not be instantiated due to having
one or
more abstract functions in the class.  The `abstract class' is used as a
base class
for inheridence.  For example, the following class is an abstract class:

class CShape
{
public:
   void virtual Draw() = 0;
   int   GetType();
   ...
private:
   int   m_nType;
};

The strange looking syntax `void virtual Draw() = 0' is how an abstract
function is 
declared.  This has several consequences:

1.  As stated before, it is impossible to instantiate an abstract class.  

2.  The compiler will require that _all_ classes derived from an abstract
class provide
    an implementation for the abstract function.  

3.  You can use pointers to the abstract class to get polymorphic behavior.
For example,
    if you represent a picture an a collections of shapes, you can declare a
picture like:

     std::vector<CShape*>     pic;

    and the compiler will be happy.  You will need typecast the derived
classes to the
    parent class to insert into the collection.  

George



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2004-06-21 14:55 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-06-20  4:46 Pointers to classes Eric
2004-06-20  5:06 ` John T. Williams
2004-06-20  5:18   ` John T. Williams
2004-06-20 12:49     ` LDB
2004-06-20 13:30     ` Eric
  -- strict thread matches above, loose matches on Subject: below --
2004-06-21 14:55 Huber, George K RDECOM CERDEC STCD SRI

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).