Mindtraveller wrote on Mon, 08 September 2008 05:25
Simplified code as a description of problem:
class Project
{
Project(TabCtrl &tabs) {/*add new tab with Project controls*/}
};
class App
{
void Serialize (Stream &stream) {stream % projects;} //ERROR: no default constructor available
Array<Project> projects;
TabCtrl mainTabs;
};
Is there a way I can fetch my Project objects with auto-adding to the tabs?
Yes, but not really recomended
The trick would be to implement your own Array serialization, using "new" variant of Add.
Something like:
if(s.IsLoading())
projects.Clear();
int count = projects.GetCount();
s % count;
for(int i = 0; i < count; i++)
if(s.IsStoring())
s % projects[i];
else
s % projects.Add(new Project(tabs));
(I would rather find some other solution. IMO, except special cases, classes should have default constructors).
Mindtraveller Messages: 917 Registered: August 2007 Location: Russia, Moscow rgn.
Experienced Contributor
So what "right", or "typical" solution of such a common problem is recommended? Just to make default constructor along with something like void Setup(.....) ?
This method has one big drawback: I can`t hold any references inside Project class because I can`t initialize them in constructor. In my previous example this means i.e. I can`t hold tabs reference inside Project which is very uncomfortable. Using simple pointer and setting it inside Setup() is no good too.
Mindtraveller wrote on Tue, 09 September 2008 02:47
So what "right", or "typical" solution of such a common problem is recommended? Just to make default constructor along with something like void Setup(.....) ?
Well, I actually do not really know what degree of flexibility is needed... Is the number of projects fixed and only the content is changing? Too little info to discuss the solution.
Quote:
This method has one big drawback: I can`t hold any references inside Project class because I can`t initialize them in constructor. In my previous example this means i.e. I can`t hold tabs reference inside Project which is very uncomfortable. Using simple pointer and setting it inside Setup() is no good too.
That is correct. Personally I would do this sacrifice in order to avoid "Add(new)" variant. (Well, as you might have noticed, I tend to judge the quality of code by number of new/delete statements
Mindtraveller Messages: 917 Registered: August 2007 Location: Russia, Moscow rgn.
Experienced Contributor
luzr wrote on Tue, 09 September 2008 10:57
Quote:
This method has one big drawback: I can`t hold any references inside Project class because I can`t initialize them in constructor. In my previous example this means i.e. I can`t hold tabs reference inside Project which is very uncomfortable. Using simple pointer and setting it inside Setup() is no good too.
That is correct. Personally I would do this sacrifice in order to avoid "Add(new)" variant. (Well, as you might have noticed, I tend to judge the quality of code by number of new/delete statements
Thanks. I think I`ll store these objects pointers in Ptr objects. This would at least look better than plain pointers.
Mindtraveller wrote on Tue, 09 September 2008 03:38
luzr wrote on Tue, 09 September 2008 10:57
Quote:
This method has one big drawback: I can`t hold any references inside Project class because I can`t initialize them in constructor. In my previous example this means i.e. I can`t hold tabs reference inside Project which is very uncomfortable. Using simple pointer and setting it inside Setup() is no good too.
That is correct. Personally I would do this sacrifice in order to avoid "Add(new)" variant. (Well, as you might have noticed, I tend to judge the quality of code by number of new/delete statements
Thanks. I think I`ll store these objects pointers in Ptr objects. This would at least look better than plain pointers.
That is only useful if they can get destructed while "parent" object is alive....