473,414 Members | 1,606 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,414 software developers and data experts.

slightly interresting derrived class problem

I start off with an interface class that has no data members and a
handful of virtual functions.
First Question: is that allowed ?
I then derived from this class and it gets included into a couple of
other classes that need that interface. The derived class had a number
of data members including a struct that allow it to do its dirty work.

When I directly access any data members (through pointers or through
public data members) in the derrived class hilarity ensues. I found
that the value returned is offset by 4 bytes( 32bits ).

for example, if I wanted:
class1.public_struct.int0
I would get
class1.public_struct.int1
more curiously this problem would only show up when i ran the release
version of the code. The debug version behaved correctly.

After an entire wasted morning I added an unused data member to the
very first interface class and all problems dissapeared like a fart in
the wind.

Main Question: Is this a compiler error or did I violate the standard?

May 29 '06 #1
9 1630
easy wrote:
I start off with an interface class that has no data members and a
handful of virtual functions.
First Question: is that allowed ?
Sure, why not? A class can (I think) be empty, or it can contain a
number of variables and/or functions (including virtual ones).
I then derived from this class and it gets included into a couple of
other classes that need that interface. The derived class had a number
of data members including a struct that allow it to do its dirty work.

When I directly access any data members (through pointers or through
public data members) in the derrived class hilarity ensues. I found
that the value returned is offset by 4 bytes( 32bits ).
First of all, see if you can live without public members. Some get/set
functions might be a lot cleaner.

And it'd be great if you could describe what exactly explodes in your
code when you access a public member. If you use the GNU compiler, you
could even try to compile it with optimization AND debug (-g -O2 for
instance), to see if the bug appears.
for example, if I wanted:
class1.public_struct.int0
I would get
class1.public_struct.int1


Is class1 the derived class, or are you doing something with the base class?
May 29 '06 #2
easy wrote:
I start off with an interface class that has no data members and a
handful of virtual functions.

First Question: is that allowed ?
If you do it correctly, yes.
I then derived from this class and it gets included into a couple of
other classes that need that interface. The derived class had a number
of data members including a struct that allow it to do its dirty work.
Whoo hoo! Dirty work? Ok.
When I directly access any data members (through pointers or through
public data members) in the derrived class hilarity ensues. I found
that the value returned is offset by 4 bytes( 32bits ).

for example, if I wanted:
class1.public_struct.int0
I would get
class1.public_struct.int1

more curiously this problem would only show up when i ran the release
version of the code. The debug version behaved correctly.

After an entire wasted morning I added an unused data member to the
very first interface class and all problems dissapeared like a fart in
the wind.

Main Question: Is this a compiler error or did I violate the standard?


It sounds like you've got some kind of data slicing going on. Some
place in there, your pointer thinks it's pointing at a different kind
of
object from what it is actually pointing at. The result is, when it
tries to find int0 it is looking where it expects int0, but it has
found
instead int1. (Or the other way over.)

In debug mode, there may be other stuff in there that shoves stuff
around by amounts that are not defined in the standard. It could
quite easily be that the base class is shoved forward 4 bytes, and
the derived by 8. And so when you make your off-by-4 errror, it
gets another error in the other direction from the debug info.

Post a minimal compilable code sample that shows the problem,
and we may be able to help.
Socks

May 29 '06 #3
easy wrote:
I start off with an interface class that has no data members and a
handful of virtual functions.
First Question: is that allowed ?
Uh... Yes. Does your compiler tell you something you don't believe
it should?
I then derived from this class and it gets included into a couple of
other classes that need that interface. The derived class had a
number of data members including a struct that allow it to do its
dirty work.
OK...
When I directly access any data members (through pointers or through
public data members) in the derrived class hilarity ensues. I found
that the value returned is offset by 4 bytes( 32bits ).

for example, if I wanted:
class1.public_struct.int0
I would get
class1.public_struct.int1
That's bizarre.
more curiously this problem would only show up when i ran the release
version of the code. The debug version behaved correctly.
That sounds like an error in the compiler...
After an entire wasted morning I added an unused data member to the
very first interface class and all problems dissapeared like a fart in
the wind.

Main Question: Is this a compiler error or did I violate the standard?


To be able to tell you for sure, we'd need to see the code.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
May 29 '06 #4
Ulrich Hobelmann wrote:
easy wrote:
I start off with an interface class that has no data members and a
handful of virtual functions.

First Question: is that allowed ?
Sure, why not? A class can (I think) be empty, or it can contain a
number of variables and/or functions (including virtual ones).


Definitely. It's a very common idiom. However, some gurus (read:
Sutter) recommend preferring to avoid public virtual functions. See
_Exceptional C++ Style_ for full exposition, but basically the
reasoning is that with public virtual functions, you're combining two
interfaces into one, which is an unnecessary form of coupling and hence
needlessly restrictive. The first interface is the base class's public
interface; the second interface (in a slightly different sense of the
word) is the "customization interface" presented to derived classes.
Two different audiences.

What he recommends instead is to use simple forwarding in trivial
cases, and to make use of idioms such as the Template Method pattern in
more complex cases. For example:

class Base
{
public:
void doStuff() { reallyDoStuff(); }
protected:
virtual void reallyDoStuff();
};

It may seem at first that you'd rarely get beyond such trivial cases
and really wind up using Template Method a lot, but that's a result of
being stuck in the mindset of combining these two interfaces. A member
function corresponds to a responsibility -- surely it happens quite
frequently that there is not a 1:1 mapping between publicly visible
responsibilities and behavior intended to be customized by subclasses!
First of all, see if you can live without public members. Some get/set
functions might be a lot cleaner.


I agree on the public members -- except in behaviorless structs,
they're generally to be avoided. However, I disagree with simply
replacing your "int x" public data with "int getX()" and "void
setX(int)." There are some arguments as to how this is better than
simple public data, but whatever advantages exist simply aren't enough.
The real answer is design -- put the data where it wants to be. Don't
provide data, provide computation. I'd go into this more, but you can
google something like "getters setters evil" for more.

Luke

May 30 '06 #5
Would it be better if I posted some files to some webspace or copied
the contents to the forum? Either way I'll post tomorrow when I get
back to work.

May 30 '06 #6
"First of all, see if you can live without public members. Some
get/set functions might be a lot cleaner."

The public members were only used by me to try and figure out what the
hell was going on.

May 30 '06 #7
* easy:
I start off with an interface class that has no data members and a
handful of virtual functions.

First Question: is that allowed ?
Yes.

I then derived from this class and it gets included into a couple of
other classes that need that interface. The derived class had a number
of data members including a struct that allow it to do its dirty work.

When I directly access any data members (through pointers or through
public data members) in the derrived class hilarity ensues. I found
that the value returned is offset by 4 bytes( 32bits ).

for example, if I wanted:
class1.public_struct.int0
I would get
class1.public_struct.int1
more curiously this problem would only show up when i ran the release
version of the code. The debug version behaved correctly.
Post a minimal example that compiles.

For other requirements on posting example code, see the FAQ item "How do
I post a question about code that doesn't work correctly?", currently at
<url: http://www.parashift.com/c++-faq-lite/how-to-post.html#faq-5.8>.

After an entire wasted morning I added an unused data member to the
very first interface class and all problems dissapeared like a fart in
the wind.

Main Question: Is this a compiler error or did I violate the standard?


Probably the latter, but not in the way you indicated above.

--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
May 30 '06 #8
easy wrote:
Would it be better if I posted some files to some webspace or copied
the contents to the forum? Either way I'll post tomorrow when I get
back to work.


Please quote the post you're replying to, as a matter of longstanding
Usenet conventional courtesy.

You should post your source code directly to the newsgroup -- however,
it's important to post a *minimal* example that demonstrates the
problem. Most problems appropriate for newsgroup discussion can be
described in a page or so of code. *Compilable* code, mind.

Luke

May 30 '06 #9
Luke Meyers wrote:
Definitely. It's a very common idiom. However, some gurus (read:
Sutter) recommend preferring to avoid public virtual functions. See
_Exceptional C++ Style_ for full exposition, but basically the
reasoning is that with public virtual functions, you're combining two
interfaces into one, which is an unnecessary form of coupling and hence
needlessly restrictive. The first interface is the base class's public
interface; the second interface (in a slightly different sense of the
word) is the "customization interface" presented to derived classes.
Two different audiences.
Hm, interesting view. Coming from a Java background, I'd rather say
that the whole point of virtual functions is being public. A set of
virtual functions is the base class's interface that other classes can
implement. So, I don't think they are harmful (even if usually I
strongly prefer non-virtual functions and composition when possible,
both for performance and for clarity).

I'd be careful with (non-virtual) inheritance (i.e. with not
implementing a clear, documented interface).
I agree on the public members -- except in behaviorless structs,
they're generally to be avoided. However, I disagree with simply
replacing your "int x" public data with "int getX()" and "void
setX(int)." There are some arguments as to how this is better than
simple public data, but whatever advantages exist simply aren't enough.
The real answer is design -- put the data where it wants to be. Don't
provide data, provide computation. I'd go into this more, but you can
google something like "getters setters evil" for more.


Cool, thanks for the link; I'll look into it. Myself, I sometimes avoid
get/setters (and use structs instead), just for convenience, but I
thought I should mention the "official" view ;)
May 30 '06 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

9
by: Ingo Nolden | last post by:
Hi there, I am writing c++ for some months now. I think I know the language now, but not yet all the tricky things of stl. For a kernel which is not using mfc I am writing a serialization. For...
4
by: Deniz Bahar | last post by:
Hello, A couple days ago my friend (OOP guy) shows me what OOP was all about in C++. This morning I figured I can do pretty much the same thing with C (by putting function pointers in...
3
by: jrhoads23 | last post by:
If you look at a standard Button in a .NET Windows Forms app, you will notice its default BackColor is "Control" and it has a 3D raised border which is 2 pixels wide. The outer edge on the left and...
2
by: Elephant | last post by:
Hello, question, I want to make a COM-compatible .NET DLL (Visual Basic). For this I need an interface. The DLL has a class that must contain methods that can be used without making an instance...
1
by: Anonymous | last post by:
I am working on a suite of existing libraries and I anticipate a future problem. the problem (as i see it), arises as a result of the following: There is a class A that resides in librray A, and...
1
by: Phil Latio | last post by:
I have a number of spreadsheets, each with between 1000-6000 rows (each row is a property) and they all need to be combined into a single database. Each spreadsheet contains slightly different...
3
by: pauldepstein | last post by:
I am using the latest version of Visual c++ on windows XP. I am trying to build a project and get a lnk1104 error regarding a file of the form .../../ ProjectName.lib No other errors, just this...
4
by: Ken Fine | last post by:
I know about this: http://silverlight.net/forums/14.aspx and this: http://forums.asp.net/1127.aspx Silverlight Beta 2 was announced at TechEd. I was impressed. When does Silverlight get a...
4
by: rlwebbnafex | last post by:
Hello, I have never used generic programming so I need a little help for an idea on what I can do. I have defined a lot of classes like the following. The classes are all pretty much the same,...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.