如何更改默认构造函数的参数? 使用您的代码的示例 main()是完整示例

如何解决如何更改默认构造函数的参数? 使用您的代码的示例 main()是完整示例

我有一个称为Date的类,用于控制日期。

我有一个构造函数Date()。如果此构造函数未初始化,则默认日期将由名为default_的私有静态数据成员放置在其位置。

我已经在default_中初始化了Date.cpp,如下所示:

Date Date::default_{1,Month::January,1900};

第一个参数是白天的int,第二个参数是月份的enum class的{​​{1}},而第三个年份是Month。 / p>

运行该程序时,我可以打印日期,并显示由int设置的正确的默认日期。

问题:

我希望能够使用以下功能更改默认日期:

default_

我该怎么做?我尝试如下实施setDefaultDate(int day,Month month,int year) ,但无法正常工作:

setDefaultDate()

代码:

Date.h:

void Date::setDefaultDate(int day,int year)
{
    default_ = {day,month,year};
}

Date.cpp:

#ifndef DATE_H
#define DATE_H
// date.h
// class Date declaration

#include <cassert>
#include <iostream>
using namespace std;

enum class Month
{
   January = 1,February,March,April,May,June,July,August,September,October,November,December
};

class Date
{
public:
   // return the day of the month
   int   day () const;
   // return the month of the year
   Month month () const;
   // return the year
   int year () const;

Date();
   static void setDefaultDate(int day,int year);

private:

   int   day_;
   Month month_;
   int   year_;

   static Date default_;
};

// standalone function for printing the date
void printDate(const Date& date);

#endif

示例

// date.cpp
// Implementation of the Date class

#include "date.h"

int Date::day() const
{
   return day_;
}

Month Date::month() const
{
   return month_;
}

int Date::year() const
{
   return year_;
}

// Note,this standalone function is not part of the Date class
void printDate(const Date& date)
{
   cout << date.day() << "/"
       // cast to an integer to allow the month to be sent to the stream
<< static_cast<int>(date.month()) << "/"
       << date.year()
       << endl;
}

Date Date::default_{1,1900};

void Date::setDefaultDate(int day,int year)
{
   default_ = {day,year};
}

Date::Date()
{
   day_ = default_.day();
   month_ = default_.month();
   year_ = default_.year();
}

预期输出:
29/9/2020

实际输出:
1900年1月1日

它可以编译,但是int main() { auto date_1 = Date{}; date_1.setDefaultDate(29,Month::September,2020); printDate(date_1); } 函数不起作用,并且正在输出在setDefaultDate()中声明的默认日期。

解决方法

让我们一步一步地浏览您的main

auto date_1 = Date{};

这将做什么?它将调用Date::Date,它将把所有值从default_读入date_1。此时default_1/1/1900,现在date_1是相同的。然后

date_1.setDefaultDate(29,Month::September,2020);

将仅更改default_default_。我不确定您为什么期望date_1在这里更改,也许是因为您像非静态成员函数那样调用了它?您可能打算更改默认日期之前从中读取。您可以这样做:

int main()
{
    // call it like static function
    Date::setDefaultDate(29,2020);

    // Only then read from it.
    auto date_1 = Date{};
    
    // prints 29/9/2020
    printDate(date_1); 
}
,

您的setDefaultDate()方法仅将default_的值设置为{em> ,main()已经在调用Date()构造函数时复制了该值date_1对象。之后更改default_的值对date_1的值没有任何影响。当打印date_1时,将输出初始化时使用的值。更改default_的值只会影响随后创建的后续 Date对象。

如果要更改date_1的值,则需要:

  1. 致电setDefaultDate() 之前致电Date()
int main()
{
    Date::setDefaultDate(29,2020);
    Date date_1;
    printDate(date_1); // 29/9/2020
}
  1. 添加非静态方法来更改Date对象的值。您还应该添加一个非默认构造函数,该构造函数可以采用用户指定的日期作为输入,例如:
class Date
{
public:
   Date();
   Date(int initialDay,Month initialMonth,int initialYear);

   ...

   void setDay (int newValue);
   void setMonth (Month newValue);
   void setYear (int newValue);

   ...
};
Date::Date() :
   Date(default_.day_,default_.month_,default_.year_)
{
}

Date::Date(int initialDay,int initialYear) :
   day_(initialDay),month_(initialMonth),year_(initialYear)
{
}

void Date::setDay (int newValue)
{
   day_ = newValue;
}

void Date::setMonth (Month newValue)
{
   month_ = newValue;
}

void Date::setYear (int newValue)
{
   year_ = newValue;
}

...
int main()
{
    Date date_1;
    printDate(date_1); // 1/1/1900

    date_1.setDay(29);
    date_1.setMonth(Month::September);
    date_1.setYear(2020);
    printDate(date_1); // 29/9/2020

    date_1 = Date(9,2020);
    printDate(date_1); // 9/9/2020

    Date date_2(31,Month::December,2020);
    printDate(date_2); // 31/12/2020

    Date::setDefaultDate(1,Month::April,2020);

    Date date_3;
    printDate(date_3); // 1/4/2020
}
,

如果我正确理解的话,我将向您显示代码的修改版本,该版本应该可以满足您的要求。为了使用单个文件,我对您的代码做了一些更改

java不是C ++,C ++不是Java。 C ++中的static东西不是Java方式。也许您已经习惯了。

C ++中的一件事是,您可以在main()外部中设置默认的运行代码,并在类外部设置为

...
}; // class Date{}

int Date::default_day = 1;
int Date::default_month = 1;
int Date::default_year = 1900;

void printDate(const Date& date);
void setDefaultDate(int,int,int);

int main(void)
{
...

因此,您已加载了第一组默认值。

如果您在main()中进行编译,则它将编译,但链接器会 抱怨他们三个都没有解决。

  • 对于setDefaultDate(),您只需将其声明为Date的friend
    friend void setDefaultDate(int,int);
  • PrintDate()的一种方便且常见的替代方法是将另一个friend声明为Date
    friend ostream& operator<<(ostream&,Date&);

使用您的代码的示例

节目显示


just a date at start (should use defaults 1900,1,1)

printDate()
 d: 1 m: 1 y: 1900

Now sets default to 1901/3/2

printDate()
 d: 2 m: 3 y: 1901

Now declared new Date instance as d3(2019,8,7)

printDate()
 d: 7 m: 8 y: 2019

Now print all 3 dates using "<<" operator,redefined for Date class

printDate using insertion operator '<<'
        year is 1900 month is 1 year is 1900

printDate using insertion operator '<<'
        year is 1901 month is 3 year is 1901

printDate using insertion operator '<<'
        year is 2019 month is 8 year is 2019

main()

int main(void)
{
    cout << "\njust a date at start (should use defaults 1900,1)\n";
    Date d1;
    printDate(d1);
    cout << "\nNow sets default to 1901/3/2\n";
    setDefaultDate(2,3,1901);
    Date d2;
    printDate(d2);
    cout << "\nNow declared new Date instance as d3(2019,7)\n";
    Date d3(2019,7);
    printDate(d3);
    cout << "\nNow print all 3 dates using \"<<\" operator,redefined for Date class\n";
    cout << d1 << d2;
    cout << d3;
    return 0;
}
  • 代码使用printDate()以及重载的<<来替代printDate()。我为三个cout留了两个Date,只是为了表明您可以像其他任何cout调用一样链接打印。
  • 程序在之前内部 main()
  • 设置默认值
  • 我添加了第二个构造函数,该构造函数接受daymonthyear作为参数

完整示例

#include <iostream>
using namespace std;

class Date
{
private:
    int  year_;
    int  month_;
    int  day_;

public:
    int year()  const { return year_;  };
    int month() const { return month_; };
    int day()   const { return day_;   };

    // default as Date d;
    Date() : 
        year_(default_year),month_(default_month),day_(default_day) {};
    // as Date d(2020,9,8)
    Date(int y,int m,int d) :
        year_(y),month_(m),day_(d){};

    friend void setDefaultDate(int,int);
    friend ostream& operator<<(ostream&,Date&);

private:
    static int  default_year;
    static int  default_month;
    static int  default_day;

}; // class Date{}

int Date::default_day = 1;
int Date::default_month = 1;
int Date::default_year = 1900;

void printDate(const Date& date);
void setDefaultDate(int,int);

int main(void)
{
    cout << "\njust a date at start (should use defaults 1900,redefined for Date class\n";
    cout << d1 << d2;
    cout << d3;
    return 0;
}


void printDate(const Date& date)
{
    cout << "\nprintDate()\n" <<
        " d: " << date.day() <<
        " m: " << date.month() <<
        " y: " << date.year()
        << endl;
};

void setDefaultDate(int day,int month,int year)
{
    Date::default_day = day;
    Date::default_month = month;
    Date::default_year = year;
};

ostream& operator<<(ostream& out,Date& date)
{
    cout << "\nprintDate using insertion operator '<<'\n" <<
        "\tyear is " << date.year_ <<
        " month is " << date.month_ <<
        " year is " << date.year_ <<
        endl;
    return out;
};

这里没有宗教信仰。我在 MSVC 19.27

下编译了它

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-