Hi, While working to convert the csv importer to c++ I've come across this issue:
At some point the importer code wants to keep track of a set of values that can be used to create a transaction from. The transactions can't be created immediately in that part of the code because user manipulations in the GUI can change the interpretation of these values. The c code used a glist to keep a list of these values (or "properties), each value being encapsulated in a struct that also keeps some meta information. For reference the old code starts here: https://github.com/gjanssens/gnucash/blob/cpp/src/import-export/csv-imp/gnc-csv-model.c#L623 To avoid code duplication, I chose to replace the struct with a small hierarchy of classes, the base class being GncTransProperty, which handles the common parts and derived classes for each type of value that can exist: * one to keep track of an account (Account *), * one to keep track of strings (std::string), * one to store a time value (time64) * and lastly one to keep an amount (gnc_numeric). I also chose a generic base class to allow the instances to be stored in a std::vector. Which properties get stored will depend on the user choices in the GUI. (I say "will" as that part is not set up just yet). Current attempt of the code is here https://github.com/gjanssens/gnucash/blob/cpp/src/import-export/csv-imp/gnc-trans-props.cpp and https://github.com/gjanssens/gnucash/blob/cpp/src/import-export/csv-imp/gnc-trans-props.hpp Unfortunately this code fails to compile. The error I don't know how to handle is this one: src/import-export/csv-imp/gnc-trans-props.cpp:232:10: error: And similar errors for each specialized class I defined. I do understand the reason for this error: return type Account * is not the same type as void * as in the virtual function in the base class and I explicitly stated I want to override a virtual function (as per Meyers Effective Modern C++ recommendation). What I'm unable to figure out is how to do this properly. The code that will eventually call this function will need to get the Account to create a split. It will also need to call a get_value on another property to get, say the amount (a gnc_numeric). So depending on the property being stored, I need another return type. Or don't I ? What's a good idiom to encapsulate this information until the point where the differentiation is relevant (only when storing a value or retrieving it) ? Geert _______________________________________________ gnucash-devel mailing list gnucash-devel@gnucash.org https://lists.gnucash.org/mailman/listinfo/gnucash-devel