|
If I have Class B which is a multiple occurence of CLass A plus some added fuctionality
does it make sence to have the contructer of B declared
B :: B(CArray(A, &A))
{
Thankx
|
|
|
|
|
That clearly depends.
In the current case, your class b has a member variable of type CArray(A, &A) ?
Then it could very well make sense to have a c'tor like
B :: B( CArray(A, &A) Array)
: m_array( Array)
{
}
private:
CArray(A, &A) m_array;
Though I speak with the tongues of men and of angels, and have not money, I am become as a sounding brass, or a tinkling cymbal. George Orwell, "Keep the Aspidistra Flying", Opening words
|
|
|
|
|
I am not quite familiar with the last part of constructer prototype B : : (CArray(A &A) Array) : m_array(Array)
But I will look it up
Hope I am writting clearer
|
|
|
|
|
This is called "initializer list".
It is used to tell the compiler that you want to have the members initialized with c'tor parameters even before the c'tor code runs. This way, the compiler does not have to default-construct the members just for the c'tor code to overwrite them at once.
Quite often this is initialization all the c'tor needs to do.
Though I speak with the tongues of men and of angels, and have not money, I am become as a sounding brass, or a tinkling cymbal. George Orwell, "Keep the Aspidistra Flying", Opening words
|
|
|
|
|
|
Okay let me take this one step further
First off since the constructer has default values
I can declare B mybee; without any paramters
Then if I declare A mya
Then this statment is valid mybee[3] = mya
Since mybee is object of type A's
to set a limit mybee.setsize(3)
etc Have I got the right idea
|
|
|
|
|
Let me put that into code:
You have
class A {
int dummy;
};
class B {
B :: B( const CArray(A, &A)& Array)
: m_array( Array)
{
}
private:
CArray(A, &A) m_array;
};
B myB;
CArray(A, A&) arrA;
B myB( arrA);
Note that, as we have explicitly written a constructor, the compiler will not write another constructor for us - we must do this, if we need it.
Until now, B is neither derived from A nor from CArray(A) . It contains a (private, not accessible from the outside) CArray(A) .
So myB[3] is nonsensical - B is no array and does not have a operator[] .
Until now, the only way the m_Array member-variable in B can be filled is at construction time (by providing a CArray(A) ). And on the other hand, you can not construct a B without providing the CArray(A).
Though I speak with the tongues of men and of angels, and have not money, I am become as a sounding brass, or a tinkling cymbal. George Orwell, "Keep the Aspidistra Flying", Opening words
|
|
|
|
|
Could I possibly write the contructer B myB(CArray(A, A&) arrA): and then
does this make sense aRRA
A mya;
myB.aRRA[3] = mya;
|
|
|
|
|
Yes, this would be possible IF myB declares its member aRRA as public.
Otherwise, no access from the outside is possible.
Still, construction of a B would require a CArray(A, A&)
Would it be more appropriate for you to not have to supply a CArray(A, A&) at B construction time, but be able to add A s to the array contained in B ?
class A {
int dummy;
};
class B {
B::B() {
};
public:
void Add( const A& value) {
m_array.Add( value);
}
CArray(A, A&) GetArray() const {
return m_array;
}
private:
std::vector<A> m_array;
}; I Also added GetArray() , which gives you a copy of the array contained.
Note that there is no way of deleting A s from m_array . You would need to write a function for that.
Though I speak with the tongues of men and of angels, and have not money, I am become as a sounding brass, or a tinkling cymbal. George Orwell, "Keep the Aspidistra Flying", Opening words
|
|
|
|
|
Truth is since a derived class can write constructer for a base It can actullay access the private members of a base through the constructer it writes/codes for the base
|
|
|
|
|
ForNow wrote: can actullay access the private members of a base
No - I don't think so.
When the members are private , the derived class can not access them.
For protected , it can.
A derived class can call public or protected base-class constructors and member-functions and access public or protected base class members.
Or am I missing your point?
Though I speak with the tongues of men and of angels, and have not money, I am become as a sounding brass, or a tinkling cymbal. George Orwell, "Keep the Aspidistra Flying", Opening words
|
|
|
|
|
What about if the derived class writes its own Base CLass contructer. True the access is only at initilization but it can at that point in time access the Private members I think ????
|
|
|
|
|
ForNow wrote: What about if the derived class writes its own Base CLass contructer.
How would that look syntactically?
I have tried to write something, but I keep getting C2248: "Cannot access private member declared in class 'B'" in class 'C ' or C3241 "Method was not introduced by 'B'".
class A {
int dummy;
};
class B {
public:
B::B()
{};
void Add( const A& value) {
m_array.push_back( value);
}
std::vector<A> GetArray() const {
return m_array;
}
private:
std::vector<A> m_array;
};
class C : public B {
C::C()
: B.m_array( std::vector<A>( 2, A()))
{}
B::B( const std::vector<A>& val) {
m_array = val;
}
};
Though I speak with the tongues of men and of angels, and have not money, I am become as a sounding brass, or a tinkling cymbal. George Orwell, "Keep the Aspidistra Flying", Opening words
|
|
|
|
|
I cant say becuase you are far away more of an expert on OO then me
Was just reading the Book Visual C++ 2005 as I have VS 2005 Team Edition for developers and have a solution which I am wrtting an additional project to extend it The orignal Project /Solution was a C makefile project I am using this project to learn OO C++
Thankx
|
|
|
|
|
Hi all,
I have a function that sets the current working directory of a FTP server:
ftpupdate::ftp_setServerDirectory((char*)setSvrSdir);
It works when I try it on Cerberus FTP server but, when I use IIS FTP server I receive a error stating that the directory does not exists. I noticed that the IIS FTP server switches the slashes i.e.
I set the server directory:
<br />
ftpupdate::ftp_setServerDirectory("\\<directory>\\<sub directory>");
IIS: //<directory>//<sub directory> does not exists
Why is IIS doing this and not Cerberus?
Regards,
The only programmers that are better that C programmers are those who code in 1's and 0's
Programm3r
My Blog: ^_^
|
|
|
|
|
My guess...
I know unix & windows use /\ delimiters. I *assumed* the ftp protocol demands the / version (linux was around for a while before...). Maybe IIS is being thick?
Could you not do:
if (!ftpupdate::ftp_setServerDirectory((char*)setSvrSdir)
{
SwapSlashes (setSvrSdir);
ftpupdate::ftp_setServerDirectory((char*)setSvrSdir);
}
One more thing...
Why are you casting setSrvDir to char *? If its not already a character pointer, might it be unicode? or some other thing? This may be a non-issue, but it raises small alarms...
Iain.
|
|
|
|
|
Thanks for the info Iain.
Iain Clarke wrote: Why are you casting setSrvDir to char *? If its not already a character pointer, might it be unicode? or some other thing? This may be a non-issue, but it raises small alarms...
Why is that, I'm only type casting a char to a char*
Thanks again
Regards,
The only programmers that are better that C programmers are those who code in 1's and 0's
Programm3r
My Blog: ^_^
|
|
|
|
|
Hi,
I have a folder that is locked by a process in Windows.
How do I unlock the folder without killing the process??
Thanks,
Indra
|
|
|
|
|
In general you don't: what good would locking a file be if it was simply to unlock it? Everyone would simply blow away all locks before opening a file making locking useless!
Steve
|
|
|
|
|
It's not a file that I want to delete but a folder.
And the folder is empty, there are no files in it.
It has been locked uselessly by a process.
I wish to close all handles of the process that has locked this folder.
Without termintaing the process.
Please let me know if there are ways to do it.
I came across a utillity from the net that does just that, but I need the code so that the same thing can be done from our application.
|
|
|
|
|
indra20 wrote: I came across a utillity from the net that does just that, but I need the code so that the same thing can be done from our application.
Does this utility accept command-line arguments?
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
DavidCrow wrote: Does this utility accept command-line arguments?
No. The utility is called the Unlocker.
After installation it gets integrated with the windows explorer.
Please refer to the follwing link for more details:
http://ccollomb.free.fr/unlocker/[^]
Regards,
Indrajit
|
|
|
|
|
If I have in my class attribute these...
<br />
string m_strConfigFileName;<br />
ifstream m_oConfigFile;<br />
multimap<string, string> m_oApplicationConfig;<br />
What should I do in destructor? I'm getting this error "User breakpoint called from code at 0x7c901230". Stack trace:
<br />
NTDLL! 7c901230()<br />
NTDLL! 7c96cd80()<br />
NTDLL! 7c960af8()<br />
KERNEL32! 7c85e9cf()<br />
_CrtIsValidHeapPointer(const void * 0x004433a8) line 1697<br />
_free_dbg_lk(void * 0x004433a8, int 1) line 1044 + 9 bytes<br />
_free_dbg(void * 0x004433a8, int 1) line 1001 + 13 bytes<br />
free(void * 0x004433a8) line 956 + 11 bytes<br />
operator delete(void * 0x004433a8) line 7 + 9 bytes<br />
std::allocator<char>::deallocate(void * 0x004433a8, unsigned int 33) line 64 + 38 bytes<br />
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(unsigned char 1) line 592<br />
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >() line 59 + 39 bytes<br />
CSomeClass::~CSomeClass() line 16 + 51 bytes<br />
Thanks!
|
|
|
|
|
devvvy wrote: string m_strConfigFileName;
devvvy wrote: std::basic_string,std::allocator >::~basic_string,std::allocator >() line 59 + 39 bytes
CSomeClass::~CSomeClass() line 16 + 51 bytes
Try:
strConfigFileName.clear(); in the destructor.
Maxwell Chen
|
|
|
|
|
Thanks very much.
I added these to destructor (Apparently VC6/M$ didn't implement string::clear() method):
<br />
CSomeClass::~CSomeClass()<br />
{<br />
m_strConfigFileName.~basic_string(); << Crashed here!<br />
m_oApplicationConfig.clear();<br />
<br />
return;<br />
}
Exact same error
<br />
NTDLL! 7c901230()<br />
NTDLL! 7c96cd80()<br />
NTDLL! 7c960af8()<br />
KERNEL32! 7c85e9cf()<br />
_CrtIsValidHeapPointer(const void * 0x00443380) line 1697<br />
_free_dbg_lk(void * 0x00443380, int 1) line 1044 + 9 bytes<br />
_free_dbg(void * 0x00443380, int 1) line 1001 + 13 bytes<br />
free(void * 0x00443380) line 956 + 11 bytes<br />
operator delete(void * 0x00443380) line 7 + 9 bytes<br />
std::allocator<char>::deallocate(void * 0x00443380, unsigned int 33) line 64 + 38 bytes<br />
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(unsigned char 1) line 592<br />
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >() line 59 + 39 bytes<br />
std::basic_string<char,std::char_traits<char>,std::allocator<char> >::`scalar deleting destructor'(unsigned int 0) + 37 bytes<br />
CSomeClass::~CSomeClass() line 14<br />
|
|
|
|