Difference between revisions of "Kexi/Junior Jobs/Add d-pointers"

Jump to: navigation, search
(Extra tasks needed)
(Related tasks needed)
Line 67: Line 67:
 
Converting non-trivial classes to use d-pointer may also require:
 
Converting non-trivial classes to use d-pointer may also require:
 
*any code in the class' .cpp file referring to m_foo attribute should be changed to d->foo
 
*any code in the class' .cpp file referring to m_foo attribute should be changed to d->foo
*if there were public or protected member variables, move them to the d-pointer class and add getters and setters for them, example:
+
*if there were public or protected member variables, move them to the d-pointer class and add accessors and setters for them as in the example below. Read about guildelines for accessors and setters on [http://techbase.kde.org/Policies/Library_Code_Policy#Naming_Conventions Techbase].
 +
<source lang="cpp-qt">
 +
// MyClass.h
 +
class MyClass {
 +
public:
 +
  MyClass();
 +
  bool isBlack;
 +
};
 +
</source>
  
 +
After converting to d-pointer it should be:
  
*if there is inline code in header file that uses member variable, do not move the variable to d-pointer unless you know for sure it isn't there for optimization
+
<source lang="cpp-qt">
 +
// MyClass.h
 +
class MyClass {
 +
public:
 +
  MyClass();
 +
  bool isBlack() const; // notice the const
 +
  void setBlack(bool black);
 +
private:
 +
  class Private;
 +
  Private * const d;
 +
};
 +
 +
// MyClass.cpp
 +
class MyClass::Private {
 +
public:
 +
  Private()
 +
  bool isBlack;
 +
};
 +
 +
MyClass::MyClass()
 +
  : d(new Private)
 +
{
 +
  d->foo.doSomething();
 +
}
 +
 +
MyClass::~MyClass()
 +
{
 +
  delete d;
 +
}
 +
 +
bool isBlack() const
 +
{
 +
  return d->isBlack;
 +
}
 +
void setBlack(bool black)
 +
{
 +
  d->isBlack = black;
 +
}
 +
</source>
 +
 
 +
*if there is inline code in header file that uses member variable, move the variable to d-pointer class if you know for sure the inline code isn't there for optimization. If unsure, ask the mentor or the task maintainer.
  
 
==Required skills==
 
==Required skills==

Revision as of 20:16, 21 November 2011

GCI_2011_logo_URL_blueborder-nowww.jpeg
  • maintainer of this task: staniek at kde.org
  • OPEN, DIFFICULTY=2/5
  • Recommended for Google Code-IN program

Goal

Improve internal APIs in Kexi. This can be done easily by introducing d-poitners to classes that lack them.

Introduction

Read section about d-pointers on Techbase (d-pointers only, not shared d-pointers).

Classes that have to be converted are in this form:

 // MyClass.h
 class MyClass {
 public:
  MyClass();
 private:
  Foo m_foo;
 };
 
 // MyClass.cpp
 MyClass::MyClass() {
  m_foo/doSomething();
 }

After converting to d-pointer it should be:

 // MyClass.h
 class MyClass {
 public:
  MyClass();
 private:
  class Private;
  Private * const d;
 };
 
 // MyClass.cpp
 class MyClass::Private {
 public:
  Private() 
  Foo foo;
 };
 
 MyClass::MyClass()
  : d(new Private)
 {
  d->foo.doSomething();
 }
 
 MyClass::~MyClass()
 {
  delete d;
 }

List of files

This list is not complete. If you're looking for more please contact the maintainer. Please prepend assigned items with with [assigned] tag and done items with [done] tag.

  • kexi/kexiutils/
    • FlowLayout.* (note: move all inline code to .cpp)

Related tasks needed

Converting non-trivial classes to use d-pointer may also require:

  • any code in the class' .cpp file referring to m_foo attribute should be changed to d->foo
  • if there were public or protected member variables, move them to the d-pointer class and add accessors and setters for them as in the example below. Read about guildelines for accessors and setters on Techbase.
 // MyClass.h
 class MyClass {
 public:
  MyClass();
  bool isBlack;
 };

After converting to d-pointer it should be:

 // MyClass.h
 class MyClass {
 public:
  MyClass();
  bool isBlack() const; // notice the const
  void setBlack(bool black);
 private:
  class Private;
  Private * const d;
 };
 
 // MyClass.cpp
 class MyClass::Private {
 public:
  Private() 
  bool isBlack;
 };
 
 MyClass::MyClass()
  : d(new Private)
 {
  d->foo.doSomething();
 }
 
 MyClass::~MyClass()
 {
  delete d;
 }
 
 bool isBlack() const
 {
  return d->isBlack;
 }
 void setBlack(bool black)
 {
  d->isBlack = black;
 }
  • if there is inline code in header file that uses member variable, move the variable to d-pointer class if you know for sure the inline code isn't there for optimization. If unsure, ask the mentor or the task maintainer.

Required skills

Average C++ needed, at least begginner no Qt recommended.

Notes to mentor

  • This task can be naturally splited to many students but please have consistency in mind
  • Results are stored within a new branch kexi-dpointers-gci, should be created and maintained by mentor
  • Mentor should synchronize students' work within the single branch
  • Please always emphasize importance of coding style to students and check that - it's so easier to maintain the style from day one instead of fixing afterwards. Show Techbase articles for that.
  • Take care of coding practices too (see Techbase articles)

Content is available under Creative Commons License SA 4.0 unless otherwise noted.