Click here to Skip to main content
15,887,746 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hello, I am fairly new to C++ and I was wondering if I can make a struct/class with a function in that to manipulate data within that class. For example I have the following:

C++
#include <sys/stat.h>
#include <fstream>

namespace ByteReader
{
    public class IO
    {
    public:

        struct Stream
        {
            long length;
            long position;
            unsigned char* data;
        };

        struct stat results;

        int fileSize(char* filepath)
        {
            if (stat(filepath, &results) == 0)
                return results.st_size;
            else
                return 0;
        }
    };
}


I was trying to recreate the System::IO::Stream class from microsoft for a little app I'm making. I would like to have the stream setup like and have functions such as ReadInt32 into the struct/class. Is that possible to do? Also how would I pass a filepath as an argument in the class?

ie:
ByteReader::IO br = new ByteReader::IO( filepath );
Posted
Comments
Sergey Alexandrovich Kryukov 4-Jan-13 1:44am    
I cannot see what's your problem. And there is no such thing as argument in the class. Functions can have argument, and you already use them.
—SA
jakes625 4-Jan-13 1:52am    
@-SA I am trying to recreate a stream namespace/class for native C++. For example I want to do the following:

ByteReader::IO br = new ByteReader::IO( @"C:\Folder\Folder\file.log" );
int n = br->ReadInt32();
char* string = br->ReadChars( 8 );

n would return an int, string would return a char array read from that file.

Doesthis help any?
Sergey Alexandrovich Kryukov 4-Jan-13 3:41am    
What does it mean: "recreate a namespace"? "Recreate a class"? You are missing something really, really basic.
You should better explain your ultimate goal, without your idea of implementation.
—SA
Philip Stuyck 4-Jan-13 5:44am    
by creating a class, he means instantiating one. It would be better to use the correct names for things but for a beginner that is not easy. The amount of stuff to learn is huge. Nevertheless, if you want to create a instance of a class, this is called instantiating. What you get back is an object. An object is an instance of a class.
Sergey Alexandrovich Kryukov 4-Jan-13 7:26am    
I agree, but I still cannot understand those "recreating".
—SA

You have to use what is called a constructor to 'pass something to the class'.

C++
class IO{
public:
  IO(const char* filePath){_filePath=filePath;};
private:
  const char* _filePath;
};


The whole point of methods is to do manipulations on the class itself.
I think you should do some more reading. A constructor is really elementary stuff.
 
Share this answer
 
Comments
Sergey Alexandrovich Kryukov 4-Jan-13 3:38am    
Not necessarily. Any instance function can do that, because it has "this" parameter (hidden).
—SA
Philip Stuyck 4-Jan-13 5:37am    
I kept the explanation minimal for a novice user. There is also class methods, which I said nothing about.
Sergey Alexandrovich Kryukov 4-Jan-13 7:24am    
A constructor is also a method. If you simply did not even mention the word "constructor", it would be more correct. When it comes to the subject under discussion, constructors are nothing special.
—SA
Please see my comments to the question.

Just to give you and idea. Static methods are like old non-class methods, only have access to class (other class members), but instance members has hidden parameter "this". So, in such methods, you can write something like:
C++
this->myField = myMethodParameter;

This will modify the instance's field myField using the method parameter, or anything else, say, some other field.

Please see my past answer: Catch 22 - Pointers to interface objects die when function using them is made static.[^].

You see, I just respond only to your question of the title, as in Solution 1. That solution is basically correct but incomplete. You speculations about "re-creation" are completely unclear; I suspect they are based on some misconception, but I cannot figure out what exactly, sorry.

—SA
 
Share this answer
 
Comments
Philip Stuyck 4-Jan-13 5:41am    
Maybe he is just asking if it is possible to add a method that returns void. And then the answer is yes of course.
Sergey Alexandrovich Kryukov 4-Jan-13 7:25am    
Maybe. Good point.
—SA
I miss the point of the struct you defined, but yes, you can do that. I assume you will add more functionality to the class to use it.

Also, in your filesize() api, the parameter filepath should be "const char* filepath" and not "char* filepath".
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900