日志打印

日志打印

OffsetT

OffsetT<float> dragOffset = OffsetT<float>(offsetX, offsetY);
LOGE("aclq dragOffset: %{public}f, %{public}f", dragOffset.GetX(), dragOffset.GetY());

Dimension ==> ConvertToPx() 转成 double ==> 强转成 float

float minHeight = static_cast<float>(SINGLE_LINE_TITLEBAR_HEIGHT.ConvertToPx());

double ConvertToPx() const;

WeakPtr 升级为 RefPtr

RefPtr<T> Upgrade() const

std::optional 用法

std::optional 是 C++17 中引入的一个模板类,表示一个可能存在也可能不存在的值。它封装了一个值,并提供了简单的接口来判断该值是否存在。它特别适用于表示函数可能返回有效值或没有值的情况,避免了使用指针和空值的复杂性。

基本语法

#include <iostream>
#include <optional>

std::optional<int> get_positive_value(bool condition) {
    if (condition) {
        return 42;  // 返回有效的值
    } else {
        return std::nullopt;  // 表示没有值
    }
}

int main() {
    std::optional<int> value = get_positive_value(true);

    if (value) {  // 检查是否有值
        std::cout << "Value: " << value.value() << std::endl;
    } else {
        std::cout << "No value" << std::endl;
    }
    return 0;
}

主要功能

1. 构造

  • std::optional obj;:没有值,默认初始化为 std::nullopt。
  • std::optional obj(value);:初始化并包含 value。
  • std::optional obj = std::nullopt;:显式初始化为空。

2. 判断是否有值

  • obj.has_value():返回 true 如果包含有效的值,返回 false 否则
  • obj 本身可以当作布尔值来判断是否有值

3. 访问值

  • obj.value():返回存储的值。如果没有值,抛出 std::bad_optional_access 异常
  • obj.value_or(default_value):如果有值,返回该值,否则返回 default_value。

4. 修改值

  • obj = value:修改值
  • obj.reset():清空值,变为无值

5 Demo

# 基本使用
#include <iostream>
#include <optional>

int main() {
    std::optional<int> maybeInt;  // 默认是无值状态

    if (!maybeInt) {
        std::cout << "No value\n";
    }

    maybeInt = 10;  // 给它赋一个值

    if (maybeInt) {
        std::cout << "Value: " << *maybeInt << std::endl;  // 使用解引用操作符来访问值
    }

    return 0;
}
//  使用 value_or 提供一个默认值
#include <iostream>
#include <optional>

int main() {
    std::optional<int> maybeInt;

    // 使用 value_or() 提供一个默认值
    int value = maybeInt.value_or(42);
    std::cout << "Value: " << value << std::endl;  // 输出:Value: 42

    maybeInt = 10;
    value = maybeInt.value_or(42);
    std::cout << "Value: " << value << std::endl;  // 输出:Value: 10

    return 0;
}
//  通过函数返回 optional
#include <iostream>
#include <optional>

std::optional<int> divide(int numerator, int denominator) {
    if (denominator == 0) {
        return std::nullopt;  // 返回没有值,表示失败
    }
    return numerator / denominator;  // 返回结果
}

int main() {
    std::optional<int> result = divide(10, 2);

    if (result) {
        std::cout << "Result: " << *result << std::endl;
    } else {
        std::cout << "Division by zero error\n";
    }

    return 0;
}
//  使用 reset() 清空 optional
#include <iostream>
#include <optional>

int main() {
    std::optional<int> maybeInt = 10;
    std::cout << "Before reset: " << *maybeInt << std::endl;

    maybeInt.reset();  // 清空值
    if (!maybeInt) {
        std::cout << "After reset: No value\n";
    }

    return 0;
}

优势

  1. 避免空指针:不需要使用裸指针(nullptr)来表示缺失的值,避免空指针引发的问题。
  2. 类型安全:在没有值的情况下,optional 允许你显式地检查是否有值。
  3. 更简洁的 API:使用 value_or 和 has_value 等接口简化了代码逻辑。
    注意事项
  • std::optional 并不适用于所有场景,只有在某个值可能缺失时,它才是一个好选择。对于一些简单的情况,比如 nullptr 和 -1 用来表示无效值,std::optional 可能会显得过于复杂。
  • 使用 value() 获取值时,必须确保 optional 确实有值,否则会抛出异常 std::bad_optional_access。如果不确定是否有值,可以使用 value_or() 提供默认值来避免异常。
    std::optional 提供了一种优雅且类型安全的方式来处理可选值,在现代 C++ 编程中具有广泛的应用。

编译报错

error:extra qualification 'namespacexx::classxx::' on member 'function'

原因:头文件中声明函数(.h文件中声明,.cpp文件中定义)时依然加了 “类::”的前缀,取消就好。

C++ Undefined Symbol

https://floodshao.github.io/2020/06/25/c-undefined-symbol/

posted @ 2024-11-19 00:44  爱新觉罗LQ  阅读(5)  评论(0编辑  收藏  举报